2011-12-29 180 views
2

任何想法为什么菜单栏menuBar没有显示?一切看起来都很好。Java GUI菜单栏不显示

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

class mySticky extends JFrame implements ActionListener{ 

    //weStart! 

    JFrame frame = new JFrame("Sticky Note"); 
    JMenuBar menuBar = new JMenuBar(); 

    JMenu noteMenu = new JMenu("Note"); 
    JMenuItem newNote = new JMenuItem("New Note"); 
    JMenuItem open = new JMenuItem("Open"); 
    JMenuItem saveAs = new JMenuItem("Save As"); 
    JMenuItem save = new JMenuItem("Save"); 

    //Constructor 

    public mySticky(){ 

     setSize(400,300); 
     setLocation(500,250); 
     setTitle("Sticky Note"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 

     menuBar.add(noteMenu); 

     noteMenu.add(newNote); 
     noteMenu.add(open); 
     noteMenu.add(saveAs); 
     noteMenu.add(save); 
     frame.setJMenuBar(menuBar);    
    } 

    public void actionPerformed (ActionEvent e){   

    } 


    public static void main (String [] args){ 

     mySticky sticky = new mySticky(); 
     sticky.setVisible(true); 

    } 
} 
+2

发表http://sscce.org/ +1 – mKorbel 2011-12-29 21:27:22

回答

4

您将菜单栏添加到frame,它永远不会添加到任何用户界面。更换

frame.setJMenuBar(menuBar); 

通过

setJMenuBar(menuBar); 

,你的菜单栏将变得可见。或者你也应该添加frame到UI。不知道你试图达到什么。

你应该换你的主要方法的代码在Runnable并执行它的EDT(例如使用EventQueue.invokeLater

+0

完全正确。我现在明白了。恐怕我不知道'EventQueue.invokeLater'是什么? – Sobiaholic 2011-12-29 21:22:14

+0

所有的Swing操作都应该在特殊的Thread上执行。您可以使用EventQueue类中的方法在该线程上执行这些操作,例如[EventQueue.invokeLater](http://docs.oracle.com/javase/6/docs/api/java/awt/EventQueue.html #invokeLater(java.lang.Runnable))。请参阅[Swing Concurrency教程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)以获取更多信息 – Robin 2011-12-29 21:29:04

3

代替frame.setJMenuBar(menuBar),尝试this.setJMenuBar(menuBar)在你的构造。