我正在尝试将分数和经过时间标签 (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 变得没有响应(冻结)。
添加回答
举报
0/150
提交
取消