2016-02-04 13 views
1

我想分離一些我的代碼,所以我可以有一個可重用的類爲不同的項目。我現在所擁有的類被稱爲MainFrame,它現在所做的全部工作就是使用具有一個JMenu文件的JMenuBar創建一個窗口。該菜單有一個項目JMenuItem退出。來自不同類的JAVA WindowListener然後JFrame

我想讓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類的工作有什麼建議?

回答

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

如果要生成事件,則需要使用Component類的dispatchEvent(...)方法。所以你最終會把事件發送到窗口。

這種情況的基本代碼是:

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也將退出。

+0

謝謝,感謝您的快速響應 – JcBook

+0

也想說,這很容易理解,我能夠實現你沒有任何問題的建議。 – JcBook