我的代码
面板类:
import javax.swing.*;
import java.awt.*;
public class MainFramePanel extends JPanel {
public static final int WIDTH = 1700, HEIGHT = 900;
private final JMenuBar menuBar = new JMenuBar();
private final JMenu fileMenu = makeFileMenu();
private MainFramePanel() {
this.setPreferredSize(new Dimension(WIDTH, HEIGHT));
this.setLayout(new BorderLayout());
menuBar.add(fileMenu);
this.add(menuBar, BorderLayout.NORTH);
}
private JMenu makeFileMenu() {
JMenu menu = new JMenu();
JMenuItem newFile = new JMenuItem("New"),
openFile = new JMenuItem("Open"),
saveFile = new JMenuItem("Save"),
exportFile = new JMenuItem("Export As"),
exit = new JMenuItem("Exit");
menu.add(newFile); menu.add(openFile);
menu.addSeparator();
menu.add(saveFile); menu.add(exportFile);
menu.addSeparator();
menu.add(exit);
return menu;
}
private static final MainFramePanel INSTANCE = new MainFramePanel();
public static MainFramePanel getInstance() {
return INSTANCE;
}
}
框架类别:
import javax.swing.*;
public class MainFrame extends JFrame {
private MainFrame() {
super("My Program");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(MainFramePanel.getInstance());
this.pack();
this.setLocationRelativeTo(null);
}
private static final MainFrame INSTANCE = new MainFrame();
public static MainFrame getInstance() {
return INSTANCE;
}
}
我尝试设置不同的BorderLayout参数,我认为如果增加vgap,菜单栏会向下移动,但事实并非如此。我尝试通过 setBounds 而不使用布局来完成此操作,但随后菜单栏完全消失了。我尝试使用frame.setJMenuBar()但遇到了同样的问题。
默认情况下,JMenuBar 的高度由
getPreferredSize
确定,它尝试根据需要 适合所有组件。由于您的 JMenu 没有名称,JMenuBar 就像 - “既然您没有任何文本,我将使自己成为最小尺寸,这样我就不会占用不必要的空间”。因此,要解决此问题,请为您的 JMenu 命名,如下所示。
private JMenu makeFileMenu() {
JMenu menu = new JMenu();
menu.setName("File");
JMenuItem newFile = new JMenuItem("New"),
openFile = new JMenuItem("Open"),
saveFile = new JMenuItem("Save"),
exportFile = new JMenuItem("Export As"),
exit = new JMenuItem("Exit");
menu.add(newFile);
menu.add(openFile);
menu.addSeparator();
menu.add(saveFile);
menu.add(exportFile);
menu.addSeparator();
menu.add(exit);
return menu;
}
如果您感到困惑,学习
如何使用 JMenu。