如何在关闭子框架时自动取消选中(取消)jCheckBox?

时间:2015-05-05 18:10:33

标签: java jcheckbox

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

编辑:但是,我可以关闭框架" b"通过取消框架a中的jCheckBox(在主类框架中)。我想要实现的是当我关闭框架" b"时,它应该自动取消选中框架中的jCheckBox" a"。在编译我的应用程序后,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.StackOverflowError
    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)

1 个答案:

答案 0 :(得分:0)

  

在第A帧中,我确实公开访问了b类。代码 - &gt; public b frameInfo = new b();在B帧中,我确实将类似的调用回到了a类。代码 - &gt; public a frameMain = new a();我试图让应用程序在框架a中自动取消选中jCheckBoxInfo。

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

相反,您可以:

  1. WindowListener中添加a(可能使用匿名内部类,扩展WindowAdapter),而不是b。然后,您可以直接参考windowClosing()中的复选框。这可能是最干净的方法,因为它避免了ba更紧密地绑定a,并且在b中完全保持可见性处理。
  2. 如果a框架是一个以getOwner()为父窗口的对话框,您可以使用a获取所有者窗口,将其投放到a并取消勾选复选框那里。
  3. 如果没有所有者窗口(在这种情况下请参见about using multiple frames),您可以将b实例传递给class b { final a parent; public b(a parent) { this.parent = parent; ... } } ,例如作为构造函数参数:

    parent

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

  4. 如果aa.this的内部类,则它具有对封闭对象的隐式引用,可以称为a
  5. 在任何情况下,请使用对现有b的引用,您在其中创建a,而不是在b中创建新的port 68 or 67