java - 标签重叠(堆叠)有问题

标签 java swing label java-threads

我正在尝试将分数和耗时标签(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 个线程,我不确定线程​​是否会造成这个问题。代码有点长,这就是为什么我现在不共享其余部分,如果需要我也可以共享其他部分,但我认为问题不会出现在其他类上。

最佳答案

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 变得无响应(卡住)。
使用Swing timer .

关于java - 标签重叠(堆叠)有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57156369/

相关文章:

javascript - D3 折线图上的标签不起作用

ios - 变换标签字体大小

java - 如何开发接受多个 URI 的 REST Web 服务方法

java - 如何在mouseDragged事件下的DRAG_LAYER上添加JLabel

python - 如何在 matplotlib 中移动刻度标签

java - 选项出现在 JMenu 上

java - 如何在 JFrame 中获取事件监听器外部的变量?

java - Hibernate中如何连接多个表?

java - 当应用程序服务器失去互联网连接时维持服务的机制

Java:如何使用谷歌的HashBiMap?