JAVA WindowListener 来自不同的 class 然后是 JFrame
JAVA WindowListener from a different class then JFrame
我正在尝试分离我的一些代码,以便我可以为不同的项目提供可重用的 class。我现在拥有的 class 称为 MainFrame,它现在正在做的就是创建一个 window 和一个具有 JMenu 文件的 JMenuBar。该菜单有一项 JMenuItem Exit。
我试图让 WindowListener class 从我的菜单栏中工作,以便能够在关闭应用程序时执行 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;
}
}
这是我要创建的两个 classes。
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 工作的任何建议 class?
listener.windowClosing(new WindowEvent(MainFrame.this, 0));
如果要生成事件,则需要使用组件的 dispatchEvent(...) 方法 class。因此,您最终会将事件分派给 window.
基本代码是:
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);
window 将被处理,如果它是最后一个 window 打开,那么 JVM 也将退出。
我正在尝试分离我的一些代码,以便我可以为不同的项目提供可重用的 class。我现在拥有的 class 称为 MainFrame,它现在正在做的就是创建一个 window 和一个具有 JMenu 文件的 JMenuBar。该菜单有一项 JMenuItem Exit。
我试图让 WindowListener class 从我的菜单栏中工作,以便能够在关闭应用程序时执行 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;
}
}
这是我要创建的两个 classes。
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 工作的任何建议 class?
listener.windowClosing(new WindowEvent(MainFrame.this, 0));
如果要生成事件,则需要使用组件的 dispatchEvent(...) 方法 class。因此,您最终会将事件分派给 window.
基本代码是:
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);
window 将被处理,如果它是最后一个 window 打开,那么 JVM 也将退出。