2013-05-08 42 views
0

使用JMenuBar創建JFrame時出現問題。 我有一個MenuBarBuilder類在這裏:JFrame上的JMenuBar中的空JMenuItems

public class MenuBuilder extends JMenuBar 
{ 
    private Model model; 

    public MenuBuilder(Model model) 
    { 
    this.model = model; 
    buildMenuBar(); 
    } 

    public void buildMenuBar() 
    { 
    JMenu menuFile = new JMenu("File"); 
    JMenu menuEdit = new JMenu("Edit"); 
    JMenu menuHelp = new JMenu("Help"); 

    menuHelp.setMnemonic('H'); 
    menuFile.setMnemonic('F'); 
    menuEdit.setMnemonic('E'); 

    JMenuItem menuItemExit = new JMenuItem("Exit"); 

    menuItemExit.setAccelerator(model.getKeyStroke(KeyEvent.VK_ESCAPE, 0)); 

    menuItemExit.setAction(new ActionExit(model)); 

    menuFile.add(menuItemExit); 

    add(menuFile); 
    add(menuEdit); 
    add(menuHelp); 
    } 
} 

而且JFrame的是在另一個類中創建:

public MainGUI(boolean loadConfig, String loadConfigDir, Model model) 
    { 
    try 
    { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } 
    catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) 
    { 
     GlobalVariables.LOGGING_logger.error("Something went wrong while getting the Look and Feel of current Windows Version for Userinterface", e); 
    } 

    try 
    { 
     this.model = model; 

     frameMain = new JFrame("MainFrame"); 
     frameMain.setJMenuBar(new MenuBuilder(model)); 
     frameMain.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     frameMain.addWindowListener(this); 
     frameMain.setMinimumSize(new Dimension(500, 500)); 
     frameMain.pack(); 
     frameMain.setSize(800, 800); 
     frameMain.setLocationRelativeTo(null); 
     frameMain.setVisible(true); 
    } 
    catch (Exception e) 
    { 
     GlobalVariables.LOGGING_logger.error("Error while seeting up the main GUI.", e); 
     MessagesToUser.errorMessageBothFilesIssue(true); 
    } 
    } 

顯示JFrame後,所有的MenuItems是空的,但現有的和函數(ActionExit)是也工作正確。使用以下代碼menuFile.add(new JMenuItem("Exit"));設置新的JMenuItem按預期工作,並且JFrame具有正確的JMenuBar。這是爲什麼發生?

編輯: 這裏是ActionExit類只退出程序:

public class ActionExit extends AbstractAction 
{ 
    private Model model; 

    public ActionExit(Model model) 
    { 
    this.model = model; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
    System.exit(0); 
    } 
} 
+0

你實際上沒有添加任何東西到菜單(其他然後退出)? – MadProgrammer 2013-05-08 07:51:40

+0

這只是一個例子。所有菜單都有三個以上的條目。 – 2013-05-08 07:53:16

+0

那麼,你如何填充菜單呢? – MadProgrammer 2013-05-08 07:54:29

回答

1

JMenuItem(事實上的AbstractButton所有兒童)獲得來自Action.NAME財產它們的顯示文本。

嘗試更多的東西一樣......

public class ActionExit extends AbstractAction 
{ 
    private Model model; 

    public ActionExit(Model model) 
    { 
    this.model = model; 
    putValue(NAME, "Exit"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
    System.exit(0); 
    } 
} 

此外,Action類還定義了mnemonicaccelerator值。

看看How to use Actions,並瞭解更多詳情

1

檢查這一項Action API,我的小可愛的代碼,這個程序在只有一個的JMenuBar的JFrame和一個JMenuItem的 JMenuBar,這可能會幫助你。所有這些程序都是做的,退出框架,當你點擊菜單欄中的menuItem :)。爲了更好地理解,請運行這個程序

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 
public class Class5 extends JFrame 
    { 
     static JMenuBar exampleMenuBar = new JMenuBar(); 
     static JMenu fileMenu = new JMenu("Help"); 
     static JMenuItem Exit = new JMenuItem("Exit"); 


public static void main(String args[]) 
    { 
     // construct frame 
     new Class5().show(); 
    } 
public Class5() 
    { 
     // frame constructor 
     setTitle("Menu Example"); 
     setSize(100, 100); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // build menu 
     setJMenuBar(exampleMenuBar); 
     exampleMenuBar.add(fileMenu); 
     fileMenu.add(Exit); 

     Exit.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
        { 
         System.exit(0); 
        } 
      }); 



    } 

}