你如何使面板一个接一个地显示多个东西? (Java)的

时间:2015-06-03 21:53:36

标签: java swing animation jpanel thread-sleep

我有一个扩展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或与此相关的任何事情都不太了解。

2 个答案:

答案 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()方法会停止执行所有任务。它可能会产生问题。