我有一个扩展JPanel的类(它就像游戏设置一样)。在这个课程中,我有一个方法,使用for循环和Thread.sleep()
循环我的animate/display
方法8次。我的removeAll()
方法首先调用 import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.KeyEvent;
public class HardLevel extends JPanel{
public HardLevel(){
super();
runGame();
setVisible(true);
setSize(683,500);
}
public void runGame(){
for (int x = 0; x < 8; x++){
animate();
try{Thread.sleep(1000);}catch(InterruptedException a){}
}
}
public void animate(){
int num = 0;
num = (int)(Math.random() * 13 - 1 + 1) + 1;
removeAll();
JLabel desc = new JLabel("Scene number "+num);
desc.setFont(desc.getFont().deriveFont(Font.BOLD, 20));
desc.setForeground(Color.RED);
desc.setHorizontalAlignment(JLabel.LEFT);
desc.setVerticalAlignment(JLabel.TOP);
add (desc);
revalidate();
repaint();
}
}
方法,在面板上添加JLabel,然后重新验证并重新绘制。出于某种原因,当我将此类添加到JFrame并尝试运行它时,JFrame保持空白直到循环的最终运行,然后仅显示最终的JLabel。 (我测试了更改for循环运行的次数 - 无论它运行多少次,最后一次是唯一显示的循环)。以前,这个类用于扩展JFrame而不是JPanel,但为了游戏的目的,我不得不将其更改为JPanel。它作为一个JFrame工作得非常好 - 所有JLabel都应该出现。当我尝试编写完全相同的代码(稍作修改)作为JPanel时,它突然出现了这个问题,只有最后一个JLabel出现。有谁知道我做错了什么?
CODE
HardLevel h = new HardLevel();
removeAll();
add(h);
revalidate();
repaint();
上面是Extends JPanel
类的简化版本Express
上面是我将这个添加到JFrame时使用的代码
修改
这是我第一次在复杂的环境中使用Swing,所以我对EDT或与此相关的任何事情都不太了解。
答案 0 :(得分:0)
您可以使用TimerTask重复循环浏览要在JPanel上设置数据的内容。
结帐:http://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html
如果没有看到您的代码,很难说出您的实施有什么问题。
答案 1 :(得分:0)
方法repaint()用于重绘所有Frame。您无法仅重新绘制JPanel。尝试将JPanel添加到JFrame并重新绘制所有内容。使用Frame.add(JPanel);但是Thread.sleep()方法会停止执行所有任务。它可能会产生问题。