Window win = SwingUtilities.getWindowAncestor (myComponent);를 사용하여 최상위 레벨 창에 대한 참조를 얻을 수 있습니다. 메소드 호출에 최상위 레벨 윈도우가 궁극적으로 보유하는 컴포넌트에 대한 참조를 전달합니다. 주 클래스가 최상위 JFrame (다른 JFrames를 초기화하지 않음) 인 경우 반환 된 Window를 최상위 클래스 유형으로 캐스팅하고 공용 메서드를 호출 할 수 있습니다. 예를 들어
:
glowcoder의 추천에 의해 수행 될 변경된
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);
}
}
:
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();
}
}
또 다른 추천 : 당신은 스윙을 배우고 있기 때문에, 당신이 생성하는 넷빈즈를 사용하지 않는 오프 훨씬 더 좋을 것 같아 코드를 스윙하지만 스윙 앱을 직접 코딩하십시오. 이 작업을 수행하고 튜토리얼을 공부하면 Swing의 작동 방식을 훨씬 더 깊이 이해할 수 있으며 NetBeans 코드 생성기를 사용하여 가장 단순한 애플리케이션 이상을 만들어야 할 때 도움이 될 것입니다.
매력처럼 작동합니다! 하지만 이제는 또 다른 질문을 던졌습니다.!이 두 클래스가 JFrame과 JPanel을 각각 확장하지 않으면 어떻게 될까요? SwingUtilities를 사용할 수 없어야하며 Glowcoder의 솔루션 만 작동 할 것입니다 ...! 아직도 그것을하는 또 다른 방법이 있습니다 ..? – kstratis
glowcoder는 언급 한 바와 같이 참조에 대한 모든 것입니다. 하나의 객체에 대한 참조를 다른 객체로 전달하는 방법이 있어야하며, 종종 이것은 생성자 또는 설정자 (변형 자) 메소드를 통해 수행됩니다. –
귀중한 의견을 보내 주셔서 감사합니다! – kstratis