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

重新开始,然后

  1. 将大部分代码从 main 方法中取出并放入实例方法中
  2. 为您的游戏循环使用 Swing Timer,而不是 while true 循环
  3. 了解 Swing 布局并将其用于您的优势。例如,您会知道 JFrames 使用 BorderLayout,并且通过将 JLabel 添加到 BorderLayout.PAGE_START 位置,它会位于顶部。例如,frame.add(score, BorderLayout.PAGE_START);
  4. 避免设置尺寸,而是使用布局管理器和首选尺寸。
  5. 最重要的是 - 在创建 GUI 之前,从第一原则开始,包括学习干净的面向对象编程。这会为你省去很多未来的悲伤。