Window win = SwingUtilities.getWindowAncestor(myComponent);を使用してトップレベルウィンドウへの参照を取得できます。トップレベルウィンドウが最終的に保持するコンポーネントへの参照をメソッド呼び出しに渡します。あなたのメインクラスもトップレベルのJFrame(他のJFramesを初期化していない)であれば、返されたウィンドウを最上位クラスの型にキャストしてパブリックメソッドを呼び出すことができます。例えば
:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Foo1 {
public static void main(String[] args) {
MainApp mainApp = new MainApp();
mainApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainApp.pack();
mainApp.setLocationRelativeTo(null);
mainApp.setVisible(true);
}
}
class MainApp extends JFrame {
public MainApp() {
getContentPane().add(new DrawingBoard());
}
public void mainAppMethod() {
System.out.println("This is being called from the Main App");
}
}
class DrawingBoard extends JPanel {
public DrawingBoard() {
JButton button = new JButton("Button");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MainApp mainApp = (MainApp) SwingUtilities.getWindowAncestor(DrawingBoard.this);
mainApp.mainAppMethod();
}
});
add(button);
}
}
glowcoderの勧告によって行われるように変更:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Foo2 {
public static void main(String[] args) {
MainApp2 mainApp = new MainApp2();
mainApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainApp.pack();
mainApp.setLocationRelativeTo(null);
mainApp.setVisible(true);
}
}
class MainApp2 extends JFrame {
public MainApp2() {
getContentPane().add(new DrawingBoard2(this));
}
public void mainAppMethod() {
System.out.println("This is being called from the Main App");
}
}
class DrawingBoard2 extends JPanel {
private MainApp2 mainApp;
public DrawingBoard2(final MainApp2 mainApp) {
this.mainApp = mainApp;
JButton button = new JButton("Button");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
buttonActonPerformed();
}
});
add(button);
}
private void buttonActonPerformed() {
mainApp.mainAppMethod();
}
}
もう一つの推薦:あなたはスイングを学んでいることから、あなたが生成するためのNetBeansを使用していないオフにはるかに優れていますあなたのコードをスイングするのではなく、スイングアプリを手作業でコーディングしてください。これを行い、チュートリアルを勉強することで、Swingの仕組みをより深く理解することができます。NetBeansコードジェネレータを使用して、最も単純なアプリケーション以上のものを作成する必要がある場合に役立ちます。
魅力的な作品!しかし、今では別の質問をしたばかりです...!これら2つのクラスがそれぞれJFrameとJPanelを拡張していないとどうなりますか?SwingUtilitiesを使用できなくて、Glowcoderのソリューションだけが動作するようです...!まだそれを行う別の方法があります..? – kstratis
glowcoderは言及していますが、私は同意します。参照に関するものです。あるオブジェクトの参照を別のオブジェクトに渡す方法が必要であり、多くの場合、これはコンストラクタまたは設定子(ミューテータ)メソッドを通じて行われます。 –
貴重なご意見をいただきありがとうございます! – kstratis