当我关闭其子框架时,如何自动取消选中(取消勾选)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 被无限创建;或者更确切地说,直到堆栈溢出)。
相反,您可以:
- 在
a
中添加 WindowListener
(可能使用匿名内部 class,扩展 WindowAdapter
),而不是在 b
中。然后你可以直接引用windowClosing()
中的复选框。这可能是最干净的方法,因为它避免将 b
比必要的更紧密地绑定到 a
,并在 a
. 中完全保持可见性处理
- 如果
b
框架是一个以 a
作为父级 window 的对话框,您可以通过以下方式获取所有者 window:getOwner()
、cast它到 a
并取消那里的复选框。
如果没有所有者window(在这种情况下参见about using multiple frames),您可以将a
实例传递给b
,因为作为构造函数参数的示例:
class b {
final a parent;
public b(a parent) {
this.parent = parent;
...
}
}
然后您可以使用 parent
参考取消选中该复选框。
- 如果
b
是a
的一个内部class,它有一个对封闭对象的隐式引用,可以引用为a.this
。
在任何情况下,使用对现有 a
的引用,而不是在 b
中创建新的 a
。
我正在开发 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 被无限创建;或者更确切地说,直到堆栈溢出)。
相反,您可以:
- 在
a
中添加WindowListener
(可能使用匿名内部 class,扩展WindowAdapter
),而不是在b
中。然后你可以直接引用windowClosing()
中的复选框。这可能是最干净的方法,因为它避免将b
比必要的更紧密地绑定到a
,并在a
. 中完全保持可见性处理
- 如果
b
框架是一个以a
作为父级 window 的对话框,您可以通过以下方式获取所有者 window:getOwner()
、cast它到a
并取消那里的复选框。 如果没有所有者window(在这种情况下参见about using multiple frames),您可以将
a
实例传递给b
,因为作为构造函数参数的示例:class b { final a parent; public b(a parent) { this.parent = parent; ... } }
然后您可以使用
parent
参考取消选中该复选框。- 如果
b
是a
的一个内部class,它有一个对封闭对象的隐式引用,可以引用为a.this
。
在任何情况下,使用对现有 a
的引用,而不是在 b
中创建新的 a
。