在一个单独的类中,每个GUI之间进行通信

时间:2013-08-08 07:14:53

标签: java swing

所以我有2个Java类,每个类都创建一个包含各种组件的JFrame。每个类都有自己的addComponentsToPane(...)方法,用于设置框架的内容。这用在createAndShowGui()方法中,该方法在类的main方法中调用。

让我们称他们为A级和B级。所以事实是,在AI中有一个按钮,当点击时,启动B(简单调用B.main(null)。我试图做什么是这样,当点击按钮时,它将打开窗口B,但如果再次点击它就不会。现在,我几乎可以通过简单地设置一个布尔值来管理这个,但问题当然是如果我点击一次,窗口就打开了,那很好......但如果我关闭窗口B并再次单击A中的相应按钮则没有任何反应......因为布尔值仍然说B是打开的。

所以我想知道的是,鉴于这种设置,有什么方法可以在B关闭时重置A中的布尔值?我在想mabe我可以用B中的WindowListener做一些事情,但如果这是一个可能的解决方案,那么我直到找不到要配置它做什么..

2 个答案:

答案 0 :(得分:2)

不要销毁B或将引用设置为null,只需在关闭时隐藏它。您可以在应用程序启动时隐藏它,也可以只按A来按需创建它。

A.Button然后调用 - > B.show()。

如果B是JFrame(它可能应该是),您可以通过调用JFrame.setDefaultCloseOperation()来设置关闭“X”的行为。默认值应为WindowConstants.HIDE_ON_CLOSE

答案 1 :(得分:1)

基本上你需要做的是将一个Frame作为你的“主”框架,这意味着它包含主要方法。在你的情况下,这将是你的框架A.然后使框架B(而不是使用JDialog而不是JFrame)框架A的一部分。

类似的东西:

public MainApp extends JFrame { // Frame A
    ...
    private static CustomWindowB FrameB = null;
    ...
    public static void main(String[] args){
       super();
       FrameB = new CustomWindowB(...);
       ...
    }
    ...
    public void FunctionCalledByButtonClick(){
        if(FrameB == null){
           FrameB = new CustomWindowB(...);
        } else {
           if(FrameB.isVisible()){
              FrameB.hide();
           } else {
              FrameB.show();
           }
        }
    }
 }

对于B你可以这样做:

public CustomWindowB extends JDialog {  // Frame B

   public CustomWindowB(...){
      super();
      ...
      this.setVisible(true);
   }

   public void hide(){
      this.setVisisble(false);
   }

   public void show(){
      this.setVisisble(true);
   }
}