Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaSwing中侦听JFrame窗口从其父JFrame关闭_Java_Swing_User Interface - Fatal编程技术网

如何在JavaSwing中侦听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

我的程序从已经运行的父JFrame启动JFrame。第二个JFrame与第一个JFrame具有自主权,但有一个条件除外——我要求在第二个JFrame打开时(且仅当第二个JFrame打开时)禁用父JFrame中的按钮,以防止启动其他JFrame

所以我的问题是,我如何从父JFrame中听到第二个JFrame的“存在”,以便操纵我的按钮是否处于活动状态

我的父JFrame启动辅助JFrame,如下所示:

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启动时,我必须将按钮作为参数传递,因为它在一个单独的类中。否则,它将完全按照预期工作。