4

我似乎做的一切都是正确的。我只需要实现一个简单的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);
   }
}
4

2 回答 2

9

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


来自@sjr的评论:

有时revalidate需要(不仅repaint)在容器显示后更改容器(添加/删除/调整组件大小)。

于 2012-06-12T06:23:49.940 回答
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);
         }
      });
   }
}
于 2012-06-12T06:44:47.813 回答