重叠(堆叠)标签有问题
Having problem with overlapping (Stacking) Label
我正在尝试将分数和经过时间标签 (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.
我正在尝试将分数和经过时间标签 (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.