当前位置: 首页 > 知识库问答 >
问题:

java中如何检测特定窗口何时关闭

祁正阳
2023-03-14

我对Java还很陌生,我试着查了一下,但没有找到任何有用的东西。我想知道我怎么能检测到一个特定的窗口关闭了?我一直在使用windowClosing(),但这适用于关闭的任何窗口,因此如果窗口B关闭,我希望由于窗口a关闭而发生的事件也会发生。我如何只在窗口A关闭的情况下进行检测?抱歉,如果这是一个糟糕的措辞,我不知道那么多Java术语。提前致谢:)

package gui_login;

//awt classes
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

//swing classes
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JOptionPane;
import javax.swing.JButton;

public class windowtest implements ActionListener, WindowListener
{
//get JFrame
    JFrame JFrame = new JFrame();

    public static JFrame frameA = new JFrame("FrameA");
    public static JFrame frameB = new JFrame("FrameB");
    static windowtest windowtest = new windowtest();

public static void main(String[] args) 
{
    windowtest.frames();
}

public void frames()
{
    frameA.setLayout(new FlowLayout());
    frameA.setSize(220, 130);
    frameA.setVisible(true);
    frameA.addWindowListener(this);

    frameB.setLayout(new FlowLayout());
    frameB.setSize(220, 130);
    frameB.setVisible(true);
    frameB.addWindowListener(this);
}

public void windowClosing(WindowEvent e) {
    System.out.println("Yo");
}
public void windowActivated(WindowEvent e) {
}
public void windowClosed(WindowEvent e) {
}
public void windowDeactivated(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowOpened(WindowEvent e) {
}
public void actionPerformed(ActionEvent e) {
}
}

共有1个答案

濮翰学
2023-03-14

因为FrameAFrameB使用的都是WindowListener(this)的同一实例,所以当任何一个帧关闭时,您的WindowListener都会被通知(两者/两者)。

您可以使用WinDoWeVent#GetSource获取事件的源,但更简单的解决方案可能是为每个帧提供自己的WindowListener实例,这样,您就不需要对正在发生的事情做出假设

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class WindowTest {
//get JFrame

    JFrame JFrame = new JFrame();

    public static JFrame frameA = new JFrame("FrameA");
    public static JFrame frameB = new JFrame("FrameB");
    static WindowTest windowtest = new WindowTest();

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                windowtest.frames();
            }
        });
    }

    public void frames() {
        frameA.setLayout(new FlowLayout());
        frameA.setSize(220, 130);
        frameA.setVisible(true);
        frameA.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("A is closing");
            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("A has closed");
            }

        });

        frameB.setLayout(new FlowLayout());
        frameB.setSize(220, 130);
        frameB.setVisible(true);
        frameB.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("B is closing");
            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("B has closed");
            }

        });
    }
}

您可能以前没有见过匿名类,请看一下匿名类

一般而言,不再需要实现不向类提供直接功能的接口(就像ActionListenerWindowListener)。原因是,这些接口要求您实现的方法是Public,但没有人真的应该直接调用它们。

这允许您在类内部“隐藏”实现细节,并防止未知调用方可能的误用

您可能还想看看嵌套类

 类似资料:
  • 问题内容: 我使用Selenium WebDriver。我打开第一页,然后打开第二页- 执行一些操作,然后返回第一页。在我想关闭第二页之前,我使用了命令,但是它关闭了第一页而不是第二页。如何使Selenium关闭特定窗口? 部分代码 问题答案: 这对我有用…

  • 我有一个微服务,它会收到一条消息,大概是这样的: 是否有任何开箱即用的解决方案允许方法每天在给定时间运行?使用 Spring 中的 cron 不涉及在运行时更改时间。我需要使用更灵活的选项(更改运行时,多次启动) 谢谢!

  • 问题内容: 有谁知道我可以使用JavaScript检查浏览器窗口何时关闭并弹出确认对话框询问用户是否确认退出浏览器还是改变主意的任何方式? 问题答案: window.onbeforeunload = function (e) { var e = e || window.event;

  • 本文向大家介绍javascript在当前窗口关闭前检测窗口是否关闭,包括了javascript在当前窗口关闭前检测窗口是否关闭的使用技巧和注意事项,需要的朋友参考一下 在当前窗口关闭前,检测当前窗口是否关闭 在ie9中,如果刷新文档的话,unloadform和onbeforeunload都会执行,如果是关闭页面的话只会执行onbeforeunload事件 值得注意的是,onunload在关闭页面时

  • 作为Java的新手,多年的iOS和。NET的经验,我发现这是非常令人困惑。我想要的是一个非常简单的对话框(从主窗口调用),带有OK和Cancel按钮。单击“确定”时,它会执行一些操作,然后关闭对话框。单击“取消”时,它只会取消对话框。 然而,使用SWT shell对话框类来实现这一点并不明显。如何获得一个按钮来关闭对话框,并将执行返回到主窗口?

  • Firefox 在将拖动到窗口外时无法正确触发 dragleave 事件: https://bugzilla.mozilla.org/show_bug.cgi?id=665704 https://bugzilla.mozilla.org/show_bug.cgi?id=656164 我正试图开发一个解决办法(我知道这是可能的,因为Gmail正在做),但我能想到的唯一一件事似乎真的很黑客。 了解在窗