JMenuBar没有显示

时间:2012-06-12 06:18:25

标签: java swing jmenu jmenuitem 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);
   }
}

2 个答案:

答案 0 :(得分:8)

您正在做的是首先显示框架,然后向其添加菜单栏。不起作用。你应该做反向。最后或至少在设置菜单栏后移动frame.setVisible (true);行。在向其添加所有组件后应始终显示框架,否则在显示框架后添加的组件将在repaint()完成后才会显示。


来自@sjr的评论:

  

有时需要revalidate(不仅repaint)来改变a   容器后面的容器(添加/删除/调整组件)   已经显示。

答案 1 :(得分: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);
         }
      });
   }
}