当我关闭其子框架时,如何自动取消选中(取消勾选)jCheckBox?

How to uncheck(untick) the jCheckBox automatically when I close its child frame?

我正在开发 Java 应用程序。主 class 框架名称为 "a"。在框架 "a" 中,有一个组件 - jCheckBox。因此,当我检查(勾选)这个 jCheckBox 时,它会打开另一个框架 "b"。我想在关闭框架 "b" 时取消勾选 jCheckBox,但它似乎无法工作。知道如何解决这个问题吗?谢谢。

编辑:但是,我可以通过取消选中框架 a 中的 jCheckBox(在主 class 框架中)来关闭框架 "b"。我想要实现的是当我关闭框架 "b", 它应该自动取消选中框架 "a" 中的 jCheckBox。 IDE 在我编译我的应用程序后向我展示了很多错误。

我的代码: (在主框架 A 中)

  private void jCheckBoxInfoActionPerformed(java.awt.event.ActionEvent evt) {                                              
       if (jCheckBoxInfo.isSelected()) {
                System.err.println("Frame B is opened");
                b.setVisible(true);
            } else {
                System.err.println("Frame B is closed");
                frameInfo.setVisible(false);
            }
        }

在框架 B 中:

private void formWindowClosing(java.awt.event.WindowEvent evt) {   
   boolean selected = a.jCheckBoxInfo.isSelected();
   System.err.println(selected); //To check the status of jCheckBoxInfo
   a.jCheckBoxInfo.setSelected(false);  }

输出:

Exception in thread "AWT-EventQueue-0" java.lang.WhosebugError
    at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
    at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222)
    at java.awt.Window.init(Window.java:505)
    at java.awt.Window.<init>(Window.java:537)
    at java.awt.Frame.<init>(Frame.java:420)
    at java.awt.Frame.<init>(Frame.java:385)
    at javax.swing.JFrame.<init>(JFrame.java:189)
    at b.<init>(b.java:30)
    at a.<init>(a.java:36)
    at b.<init>(b.java:26)
    at a.<init>(a.java:36)

In frame A, I did make a public access to class b. Code --> public b frameInfo = new b(); While in frame B, I did make the similar call back to class a. Code --> public a frameMain = new a(); I am trying to make the application automatically uncheck jCheckBoxInfo in frame a.

new a()就是问题所在;您不是取消选中现有框架中的框,而是创建一个新的 window 并在那里取消选中它(这反过来会导致更多 windows 被无限创建;或者更确切地说,直到堆栈溢出)。

相反,您可以:

  1. a 中添加 WindowListener(可能使用匿名内部 class,扩展 WindowAdapter),而不是在 b 中。然后你可以直接引用windowClosing()中的复选框。这可能是最干净的方法,因为它避免将 b 比必要的更紧密地绑定到 a,并在 a.
  2. 中完全保持可见性处理
  3. 如果 b 框架是一个以 a 作为父级 window 的对话框,您可以通过以下方式获取所有者 window:getOwner()、cast它到 a 并取消那里的复选框。
  4. 如果没有所有者window(在这种情况下参见about using multiple frames),您可以将a实例传递给b,因为作为构造函数参数的示例:

    class b {
        final a parent;
        public b(a parent) {
            this.parent = parent;
            ...
        }
    }
    

    然后您可以使用 parent 参考取消选中该复选框。

  5. 如果ba的一个内部class,它有一个对封闭对象的隐式引用,可以引用为a.this

在任何情况下,使用对现有 a 的引用,而不是在 b 中创建新的 a