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



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

让我们把它们称为A类和B类。所以问题是,在A中,我有一个按钮,当点击时,发射B(B.main(null)的简单调用。我想做的是,使其在单击按钮时打开窗口B,但如果再次单击,则不会。现在,我几乎可以通过设置布尔值来很好地管理这一点,但问题当然是,如果我单击一次,窗口就会打开,这很好…但如果我关闭窗口B并再次单击a中的相应按钮,则不会发生任何事情…因为布尔值仍然表示B是开的。

所以我想知道的是,在这种设置下,当B关闭时,有没有办法重置a中的布尔值?我在想也许我可以用B中的WindowListener做点什么,但如果这是一个可能的解决方案,那么我还没有弄清楚该如何配置它。

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

A.按钮然后调用-->B.显示().

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

基本上,您要做的是使一个Frame成为您的"主"框架,这意味着它包含main方法。在您的情况下,这将是您的帧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);
   }
}

最新更新