2012-06-12 97 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); 
     } 
     }); 
    } 
}