2012-06-12 137 views
2

我似乎已經做了一切正確。我只需要實現一個簡單的JMenuBar,但它似乎不起作用。有人能幫我解決嗎?JMenuBar沒有顯示

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 

public class swing { 
    public static void main (String[] args) { 
     JFrame frame = new JFrame ("menu"); 
     frame.setVisible (true); 
     frame.setSize (400, 400); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     JMenuBar bar = new JMenuBar(); 
     frame.setJMenuBar (bar); 
     bar.setVisible (true); 
     JMenu file = new JMenu ("File"); 
     bar.add (file); 
     JMenuItem open = new JMenuItem ("open"); 
     file.add(open); 
    } 
} 

回答

6

你在做什麼是先顯示框架,然後向它添加菜單欄。不起作用。你應該做相反的事。 Shift frame.setVisible (true);行結束或至少在設置菜單欄後。在添加所有組件後,您應始終顯示框架,否則在顯示框架後添加的組件將不會出現,直到完成repaint()


從評論由@sjr

有時revalidate需要(不僅repaint)作爲 已經顯示容器之後改變一個 容器(添加/刪除/調整大小組件)。

+0

+1這可能是對的。在顯示容器之後,有時需要重新驗證(不僅重新繪製)來更改容器(添加/刪除/調整組件大小),而是要求您在容器上調用「重新驗證」。 – sjr

+0

已更新的答案。 :) –

+0

@sjr非常感謝你,你只是保存了我的考試非常感謝你 – user1450466

3

試試這個,它的工作原理。

將組件添加到框架中將發生在其invisible state中,並且一旦設置了所有組件,就可以看到它。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 

public class swing extends JFrame { 
    public swing(){ 
     this.setSize(400,400); 
     this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     this.setComponent(); 
    } 

    public void setComponent(){ 
     JMenuBar bar = new JMenuBar(); 
     JMenu menu = new JMenu("Menu"); 
     this.setJMenuBar(bar); 
     bar.add(menu); 
    } 

    public static void main (String[] args) { 
     EventQueue.invokeLater(new Runnable(){ 
     public void run(){ 
      swing s = new swing(); 
      s.setVisible(true); 
     } 
     }); 
    } 
}