使用代码关闭Java窗口

5

可能是重复问题:
如何通过编程方式关闭JFrame

我正在使用JFrame开发Java GUI。 我想通过代码关闭GUI框架并将其处理掉。 我已经实现了:

topFrame.addWindowListener(new WindowListener()
        {
            public void windowClosing(WindowEvent e)
            {
                emsClient.close();
            }
            public void windowOpened(WindowEvent e) {
            }
            public void windowClosed(WindowEvent e) {
            }
            public void windowIconified(WindowEvent e) {
            }
            public void windowDeiconified(WindowEvent e) {
            }
            public void windowActivated(WindowEvent e) {
            }
            public void windowDeactivated(WindowEvent e) {
            }
        });`

我该如何触发windowClosing事件?还是有其他方法吗?

1
请查看下面的线程以达到相同的目的: https://dev59.com/3nVC5IYBdhLWcg3wixw0 - Phani
4个回答

18
这将以编程方式触发窗口关闭事件:
topFrame.dispatchEvent(new WindowEvent(topFrame, WindowEvent.WINDOW_CLOSING));

如果你想关闭框架,你需要调用:

topFrame.dispose();

请参考有关 JDialog 的相关 问答 - trashgod

3
如何调用dispose()方法?

刚试了一下,dispose()方法不会触发窗口关闭事件,但它确实可以关闭窗口。 - WhiteFang34

2
你需要这个:
yourFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

你可以在构造函数中添加那行代码(别忘了它)。

3
我认为OP想要通过编程的方式关闭它。 - Lukasz
如果是这样,他只需要捕获关闭事件并调用dispose()方法。但我不明白,为什么不在构造函数中添加该方法。有些IDE甚至在创建JFrame时自动添加它。 - javing

2
import java.awt.event.*;
import javax.swing.*;

class CloseFrame {

    public static void main(String[] args) {

        Runnable r = new Runnable() {

            public void run() {
                JButton close = new JButton("Close me programmatically");
                final JFrame f = new JFrame("Close Me");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane( close );
                close.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        // make the app. end (programatically)
                        f.dispose();
                    }
                } );
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        };

        SwingUtilities.invokeLater(r);
    }
}

非常好的sscce,但它不会触发提问者的WindowListener;根据被接受的答案,我猜这就是目标。 - trashgod
1
只是离题一下,感谢您在嵌套布局示例中添加了Mac屏幕截图。 :) - Andrew Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接