问题描述
我有一个用我的游戏引擎 Java 类制作的游戏。 游戏引擎使用paintComponent 来绘制元素。 以下是游戏的片段: gamepic
我想在这个游戏的顶部或按钮上添加一个额外的 JLabel 和 JMenu。
这是我的代码:
public class LabyrinthGUI {
private JFrame frame;
private GameEngine gameArea;
private String PlayerName;
public LabyrinthGUI(String PlayerName) {
frame = new JFrame("GAME");
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
//making new manu bar
JMenuBar mb = new JMenuBar();
JMenu sg = new JMenu("Settings");
JMenuItem ng = new JMenuItem("New game");
mb.add(ng);
mb.add(sg);
frame.getContentPane().add(mb);
gameArea = new GameEngine(PlayerName);//This is a game engine
JLabel l1 = new JLabel("First Label.");
l1.setBounds(50,50,100,30);
frame.add(l1);
frame.getContentPane().add(gameArea);
frame.setPreferredSize(new Dimension(800,600));
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
我的代码的问题是它似乎没有将 JLabel 和 JMenuBar 添加到游戏中。
解决方法
要将 JMenuBar
添加到您的 JFrame
,您必须使用 setJMenuBar()
方法:
public void setJMenuBar(JMenuBar menubar)
设置此框架的菜单栏。
参数:
-
menubar
- 放置在框架中的菜单栏
另见:
getJMenuBar()
所以你使用它:
frame.setJMenuBar(mb);
对于添加到内容窗格的标签和游戏引擎:JFrame
使用 BorderLayout
layout manager 作为将组件放置在窗格上的默认值。请参阅 JFrame
的文档:
默认内容窗格将设置一个 BorderLayout
管理器。
由于您尚未使用 BorderLayout
布局管理器指定要放置组件的确切位置,因此组件将放置在 CENTER
中。但是,BorderLayout
布局管理器定义的插槽中只能有一个组件。最新添加的组件将覆盖之前放置的组件(在同一插槽中),因此您添加的 JLabel
将被稍后添加的游戏引擎覆盖。根据您想要放置 JLabel
的方式/位置和您的游戏引擎,您必须使用不同的布局管理器或使用 BorderLayout
布局管理器指定您想要放置组件的位置。
将 JMenuBar 添加到 JFrame 的方法不是:
frame.getContentPane().add(mb);
但是:
this.frame.setJMenuBar(mb);
查看 Java 教程中的 Creating Menus 部分。