首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自不同类的JAVA WindowListener,然后是JFrame

来自不同类的JAVA WindowListener,然后是JFrame
EN

Stack Overflow用户
提问于 2016-02-04 15:58:31
回答 1查看 551关注 0票数 1

我正在尝试将我的一些代码分开,这样我就可以为不同的项目拥有一个可重用的类。我现在拥有的类名为MainFrame,它现在所做的就是创建一个具有一个JMenu文件的JMenuBar窗口。该菜单有一个项目JMenuItem退出。

我试图让WindowListener类从菜单栏中运行,以便在关闭应用程序时能够执行dispose()和System.gc()操作。

有人告诉我,这是一种比System.exit(0)更简洁的退出应用程序的方法;

代码语言:javascript
复制
public class MainFrame extends JFrame {

    private MenuBar menuBar;

    public MainFrame() {

        super("Sales");

        menuBar = new MenuBar();
        setLayout(new BorderLayout());
        setJMenuBar(createMenuBar());

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.out.println("test");
                dispose();
                System.gc();
            }
        });

        setMinimumSize(new Dimension(500, 400));
        setSize(600, 500);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private JMenuBar createMenuBar() {
        JMenuBar menuBar = new JMenuBar();

        JMenu fileMenu = new JMenu("File");
        JMenuItem exitItem = new JMenuItem("Exit");

        fileMenu.add(exitItem);

        menuBar.add(fileMenu);      

        exitItem.setMnemonic(KeyEvent.VK_X);
        exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));

        exitItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                WindowListener[] listeners = getWindowListeners();

                for(WindowListener listener: listeners) {
                    listener.windowClosing(new WindowEvent(MainFrame.this, 0));
                }
            }
        });

        return menuBar;
    }
}

下面是我要创建的两个类。

代码语言:javascript
复制
public class MainFrame extends JFrame {

private MenuBar menuBar;

public MainFrame() {

    super("Sales");

    menuBar = new MenuBar();

    setLayout(new BorderLayout());

    setJMenuBar(menuBar.getMenuBar());

    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.out.println("test");
            dispose();
            System.gc();
        }
    });

    setMinimumSize(new Dimension(500, 400));
    setSize(600, 500);
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
}

}

代码语言:javascript
复制
public class MenuBar extends JMenuBar {

private JMenuBar menuBar;
private JMenu fileMenu, settingsMenu, helpMenu;

public MenuBar() {

    menuBar = new JMenuBar();

    setFileMenu();

    menuBar.add(fileMenu);
}


//// Method to return the menu bar
public JMenuBar getMenuBar() {

    return menuBar;
}


//// Private methods to set up the menu bar
private void setFileMenu() {
    fileMenu = new JMenu("File");

    JMenuItem exitItem = new JMenuItem("Exit");



    exitItem.setMnemonic(KeyEvent.VK_X);
    exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
    fileMenu.add(exitItem);

    exitItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            WindowListener[] listeners = getWindowListeners();

            for(WindowListener listener: listeners) {
                listener.windowClosing(new WindowEvent(MainFrame.this, 0));
            }
        }
    });


}

对于如何让WindowListener从MenuBar类中工作,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-04 16:04:51

代码语言:javascript
复制
listener.windowClosing(new WindowEvent(MainFrame.this, 0));

如果您想要生成一个事件,那么需要使用dispatchEvent(.)组件类的方法。因此,您最终会将事件发送到窗口。

其基本代码是:

代码语言:javascript
复制
Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();

if (window != null)
{
    WindowEvent windowClosing = new WindowEvent(window, WindowEvent.WINDOW_CLOSING);
    window.dispatchEvent(windowClosing);
}

此外,您还可以去掉WindowListener,然后将默认的close操作更改为:

代码语言:javascript
复制
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

该窗口将被释放,如果它是打开的最后一个窗口,那么JVM也将退出。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35205670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档