如何在JavaSwing中侦听JFrame窗口从其父JFrame关闭
我的程序从已经运行的父JFrame启动JFrame。第二个JFrame与第一个JFrame具有自主权,但有一个条件除外——我要求在第二个JFrame打开时(且仅当第二个JFrame打开时)禁用父JFrame中的按钮,以防止启动其他JFrame 所以我的问题是,我如何从父JFrame中听到第二个JFrame的“存在”,以便操纵我的按钮是否处于活动状态 我的父JFrame启动辅助JFrame,如下所示:如何在JavaSwing中侦听JFrame窗口从其父JFrame关闭,java,swing,user-interface,Java,Swing,User Interface,我的程序从已经运行的父JFrame启动JFrame。第二个JFrame与第一个JFrame具有自主权,但有一个条件除外——我要求在第二个JFrame打开时(且仅当第二个JFrame打开时)禁用父JFrame中的按钮,以防止启动其他JFrame 所以我的问题是,我如何从父JFrame中听到第二个JFrame的“存在”,以便操纵我的按钮是否处于活动状态 我的父JFrame启动辅助JFrame,如下所示: try { second_frame Jframe = new second_fram
try {
second_frame Jframe = new second_frame(variable);
Jframe.second_frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
其次是:
btn_open.setEnabled(false);
在启动第二个JFrame后禁用该按钮
因此,我现在如何从第一个JFrame监听第二个JFrame的窗口状态,以便重新启用btn_open按钮。一种方法是在第二个JFrame中添加一个。每次框架关闭或打开时,都可以调用按钮.setEnabled()
。(有实现的方法)
以下是一个例子:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Example {
JButton button = new JButton("Open");
public static void main(String args[]) {
new Example();
}
public Example() {
JFrame frame = new JFrame();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new secondFrame();
}
});
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}
class secondFrame extends JFrame implements WindowListener {
public secondFrame() {
setSize(200, 200);
setVisible(true);
addWindowListener(this);
}
@Override
public void windowActivated(WindowEvent arg0) {
}
@Override
public void windowClosed(WindowEvent arg0) {
}
@Override
public void windowClosing(WindowEvent arg0) {
button.setEnabled(true);
}
@Override
public void windowDeactivated(WindowEvent arg0) {
}
@Override
public void windowDeiconified(WindowEvent arg0) {
}
@Override
public void windowIconified(WindowEvent arg0) {
}
@Override
public void windowOpened(WindowEvent arg0) {
button.setEnabled(false);
}
}
}
你不应该使用多个JFrame,但是你可以通过在第二个JFrame中添加一个来实现这一点——在第一个JFrame中不需要任何东西。是的,谢谢你,我已经被告知我以前不应该使用多个JFrame,不幸的是,这就是程序的编写方式。我知道窗口侦听器,但我不知道如何使用它来通知父JFrame中的按钮状态。将按钮的引用传递给侦听器。。。?事实上,我在MenuItem/JDialog上也做过类似的事情。我没有禁用该项,而是在选中时将现有对话框弹出到前面。这比禁用组件更有用,IMO。第二个窗口需要自治不幸的是,它必须能够与第一个窗口并行使用,因此第二个窗口需要可见性和可用性。因此,我无法在启动辅助系统时隐藏它或关闭父系统,这是很好的简单解决方案。谢谢。这几乎正是我想要的,我必须做的唯一改变是,当第二个JFrame启动时,我必须将按钮作为参数传递,因为它在一个单独的类中。否则,它将完全按照预期工作。