向JMenu添加JMenuItem导致菜单栏消失

时间:2019-09-15 19:29:00

标签: java swing jmenu jmenuitem

当我尝试将菜单项添加到菜单时,菜单栏消失。以下代码:

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class WedgeTextFrame  {  

    public static void main(String[] args){

         JFrame f = new JFrame("Menu");
         f.setVisible(true);
         f.setSize(400,400);
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         JMenuBar menubar = new JMenuBar();

         JMenu file = new JMenu("File");
         JMenu tools = new JMenu("Tools");
         menubar.add(file);
         menubar.add(tools);

         f.setJMenuBar(menubar);
    }
}

结果

image

当我在menubar.add(tools);之后添加以下几行来定义JMenuItem并将其添加到JMenu时:

JMenuItem exit_item = new JMenuItem("Exit");
tools.add(exit_item);

菜单栏消失。我正在使用JRE 1.8.0运行Eclipse 2019-06

1 个答案:

答案 0 :(得分:1)

这是“所有Swing应用程序必须在自己的线程上运行”部分的位置。看一下initial threadsthe Event Dispatch Thread。通过调用SwingUtilities#invokeLater启动应用程序将解决您的问题。

public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        JFrame f = new JFrame("Menu");
        f.setVisible(true);
        f.setSize(400, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JMenuBar menubar = new JMenuBar();

        JMenu file = new JMenu("File");
        JMenu tools = new JMenu("Tools");
        menubar.add(file);
        menubar.add(tools);

        JMenuItem exit_item = new JMenuItem("Exit");
        tools.add(exit_item);

        f.setJMenuBar(menubar);
    });
}

我还建议您在准备好整个框架后frame.setVisible(true)

SwingUtilities.invokeLater(() -> {
    JFrame f = new JFrame("Menu");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //add stuff to frame

    f.setSize(400, 400);
    f.setVisible(true); //Here at the end
});