为了账号安全,请及时绑定邮箱和手机立即绑定

重叠(堆叠)标签有问题

重叠(堆叠)标签有问题

holdtom 2023-04-13 14:47:26
我正在尝试将分数和经过时间标签 (scoreAndTimer) 添加到我已经运行的贪吃蛇游戏代码中。问题是当我使用 scoreAndTimer.setText(); 它与以前的文本堆叠在一起。我试图 setText(); 然后设置文本(字符串);清除前一个,但它也不起作用。    private JLabel scoreAndTimer;    private int sec, min;    private Game game;    public Frame() {        JFrame frame = new JFrame();        game = new Game();        frame.add(game);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.setTitle("Snake");        frame.setResizable(false);        frame.pack();        frame.setLocationRelativeTo(null);        frame.setVisible(true);        scoreAndTimer = new JLabel();        scoreAndTimer.setVerticalAlignment(SwingConstants.TOP);        scoreAndTimer.setHorizontalAlignment(SwingConstants.CENTER);        frame.add(scoreAndTimer);        timer();    }    private void timer(){        while(game.isRunning()){            scoreAndTimer.setText("SCORE: "+(game.getSnakeSize()-3)+"                                       Elapsed Time: "+timeFormatter());            try{                if(sec == 60){                    sec = 0;                    min++;                }                sec++;                Thread.sleep(1000);            }            catch (InterruptedException e) {                e.printStackTrace();            }        }        if(!game.isRunning())            scoreAndTimer.setText("Game Over");    }    private String timeFormatter(){        if(sec < 10 && min < 10)            return "0"+min+":0"+sec;        else if(sec >= 10 && min < 10)            return "0"+min+":"+sec;        else if(sec < 10 && min >= 10)            return min+"0:"+sec;        else            return min+":"+sec;    }    public static void main(String[] args) {        new Frame();    }}程序运行良好,但无法防止重叠。没有错误。我在我的程序中总共使用了 3 个线程,我不确定线程是否对此产生了问题。代码有点长,这就是为什么我现在不共享其余部分的原因,如果需要我也可以共享其他部分,但我认为问题不会出现在其他类上。
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

JFrame,或者更准确地说,它默认contentpane使用。 当您将组件添加到:BorderLayout
JFrame

frame.add(game);

您将其隐式添加到BorderLayout.CENTER位置,这是默认位置。所以frame.add(game);相当于frame.add(game, BorderLayout.CENTER);
位置BorderLayout.CENTER(以及其他BorderLayout位置)可以容纳一个组件。问题是您BorderLayout.CENTER通过以下方式将另一个组件添加到同一位置:

frame.add(scoreAndTimer);

解决方案是添加scoreAndTimer到不同的位置:

 frame.add(scoreAndTimer, BorderLayout.PAGE_END);

并且有

    frame.pack();
    frame.setVisible(true);

最后,在添加所有组件之后。

重要的旁注:
timer()所写的是行不通的。将 Swing 应用程序视为在单个线程上运行的应用程序。当这个线程忙于运行长 while 循环(就像你在里面的那个一样timer(),它不会更新 gui。gui 变得没有响应(冻结)。

查看完整回答
反对 回复 2023-04-13
  • 1 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信