gpt4 book ai didi

来自与 JFrame 不同的类的 JAVA WindowListener

转载 作者:行者123 更新时间:2023-11-29 04:51:42 25 4
gpt4 key购买 nike

我正在尝试分离我的一些代码,以便我可以为不同的项目提供一个可重用的类。我现在拥有的类称为 MainFrame,它现在正在做的就是创建一个带有 JMenuBar 的窗口,该窗口具有一个 JMenu 文件。该菜单有一项 JMenuItem Exit。

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

有人告诉我这是一种比 System.exit(0); 更干净的退出应用程序的方式;

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;
}
}

这是我要创建的两个类。

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);
}

}

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 类工作的任何建议?

最佳答案

listener.windowClosing(new WindowEvent(MainFrame.this, 0));

如果要生成事件,则需要使用 Component 类的 dispatchEvent(...) 方法。因此,您最终会将事件分派(dispatch)到窗口。

基本代码是:

Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();

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

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

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

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

关于来自与 JFrame 不同的类的 JAVA WindowListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35205670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com