Java 摇摆。在不删除背景的情况下为我的游戏贴上标签
Java Swing. Put a label over my game without erasing backdrop
我试图在我的游戏顶部放置一个标签来显示分数,但每当我这样做时,该标签都会出现在空白的灰色屏幕上并且游戏不可见。我将附上代码和我试图插入 JLabel 的区域。 (我知道代码写得不好,但我还在学习。任何提示和技巧都会很好)
public static void main(String[] args) throws InterruptedException {
int timer = 0;
int Time = 0;
JFrame frame = new JFrame("Grid Hopper");
frame.setSize(1120,800);
frame.setResizable(false);
frame.setVisible(true);
frame.setTitle("Grid Hopper");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridHopper game = new GridHopper();
game.setBackground(Color.gray);
frame.add(game);
JLabel score = new JLabel();
score.setText("Score to be calculated");
frame.add(score);
//ACTUAL GAME-RUN WHILE LOOP!
while(game.dead != true){
game.repaint();
//game.moveBall(); NOW USED FOR PLAYER MOVEMENT
if (Time > 3){
game.moveBall5();
}
if (Time > 10){
game.moveBall4();
}
if (Time > 30){
game.moveBall2();
}
if (Time > 60){
game.moveBall3();
}
game.collision();
Thread.sleep(2);
timer++;
if (timer%500 == 0){
Time++;
System.out.println(Time);
}
}
}
您应该查看布局,这可能是因为您将这两个元素添加到同一框架。考虑将元素添加到面板中,然后将面板添加到框架中:
JFrame frame = new JFrame("Grid Hopper");
frame.setSize(1120,800);
frame.setLayout(new FlowLayout());
JPanel pane = new JPanel();
pane.add(game);
pane.add(score);
frame.add(pane);
有更完整的描述here
重新开始,然后
- 将大部分代码从 main 方法中取出并放入实例方法中
- 为您的游戏循环使用 Swing Timer,而不是 while true 循环
- 了解 Swing 布局并将其用于您的优势。例如,您会知道 JFrames 使用 BorderLayout,并且通过将 JLabel 添加到 BorderLayout.PAGE_START 位置,它会位于顶部。例如,
frame.add(score, BorderLayout.PAGE_START);
- 避免设置尺寸,而是使用布局管理器和首选尺寸。
- 最重要的是 - 在创建 GUI 之前,从第一原则开始,包括学习干净的面向对象编程。这会为你省去很多未来的悲伤。
我试图在我的游戏顶部放置一个标签来显示分数,但每当我这样做时,该标签都会出现在空白的灰色屏幕上并且游戏不可见。我将附上代码和我试图插入 JLabel 的区域。 (我知道代码写得不好,但我还在学习。任何提示和技巧都会很好)
public static void main(String[] args) throws InterruptedException {
int timer = 0;
int Time = 0;
JFrame frame = new JFrame("Grid Hopper");
frame.setSize(1120,800);
frame.setResizable(false);
frame.setVisible(true);
frame.setTitle("Grid Hopper");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridHopper game = new GridHopper();
game.setBackground(Color.gray);
frame.add(game);
JLabel score = new JLabel();
score.setText("Score to be calculated");
frame.add(score);
//ACTUAL GAME-RUN WHILE LOOP!
while(game.dead != true){
game.repaint();
//game.moveBall(); NOW USED FOR PLAYER MOVEMENT
if (Time > 3){
game.moveBall5();
}
if (Time > 10){
game.moveBall4();
}
if (Time > 30){
game.moveBall2();
}
if (Time > 60){
game.moveBall3();
}
game.collision();
Thread.sleep(2);
timer++;
if (timer%500 == 0){
Time++;
System.out.println(Time);
}
}
}
您应该查看布局,这可能是因为您将这两个元素添加到同一框架。考虑将元素添加到面板中,然后将面板添加到框架中:
JFrame frame = new JFrame("Grid Hopper");
frame.setSize(1120,800);
frame.setLayout(new FlowLayout());
JPanel pane = new JPanel();
pane.add(game);
pane.add(score);
frame.add(pane);
有更完整的描述here
重新开始,然后
- 将大部分代码从 main 方法中取出并放入实例方法中
- 为您的游戏循环使用 Swing Timer,而不是 while true 循环
- 了解 Swing 布局并将其用于您的优势。例如,您会知道 JFrames 使用 BorderLayout,并且通过将 JLabel 添加到 BorderLayout.PAGE_START 位置,它会位于顶部。例如,
frame.add(score, BorderLayout.PAGE_START);
- 避免设置尺寸,而是使用布局管理器和首选尺寸。
- 最重要的是 - 在创建 GUI 之前,从第一原则开始,包括学习干净的面向对象编程。这会为你省去很多未来的悲伤。