猿问

重叠(堆叠)标签有问题

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


holdtom
浏览 108回答 1
1回答

凤凰求蛊

JFrame,或者更准确地说,它默认contentpane使用。 当您将组件添加到:BorderLayoutJFrameframe.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 变得没有响应(冻结)。
随时随地看视频慕课网APP

相关分类

Java
我要回答