2011-12-29 177 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)在你的構造。