当我尝试将菜单项添加到菜单时,菜单栏消失。以下代码:
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);
}
}
结果
当我在menubar.add(tools);
之后添加以下几行来定义JMenuItem
并将其添加到JMenu
时:
JMenuItem exit_item = new JMenuItem("Exit");
tools.add(exit_item);
菜单栏消失。我正在使用JRE 1.8.0运行Eclipse 2019-06
答案 0 :(得分:1)
这是“所有Swing应用程序必须在自己的线程上运行”部分的位置。看一下initial threads和the 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
});