1

我有一个 4 帧向量,它由一个 JButtons 的二维数组组成,该数组包含在一个 JPanel 中。我正在尝试将这些添加到 JFrame 中,以便它们在循环时显示动画。

我有一个 add 方法,当我手动增加它时可以工作,但是当我把它放在 for 循环中时,框架保持空白,就好像它没有被重新绘制一样。终端打印正确的索引号。

public void addNewFrame() throws InterruptedException {
    for (int i = 0; i < 10; i++) {
        if (index == 3) {
            System.out.println(index);
            remove(model.getFrame(3));
            revalidate();
            repaint();
            index = 0;
            add(model.getFrame(index), BorderLayout.CENTER);
            revalidate();
            repaint();
            Thread.sleep(300);
        } else {
            System.out.println(index);
            remove(model.getFrame(index));
            revalidate();
            repaint();
            index++;
            add(model.getFrame(index), BorderLayout.CENTER);
            revalidate();
            repaint();
            Thread.sleep(300);
        }
    }

这可能是并发问题吗?我应该将二维按钮数组添加到在它自己的线程中运行的 JPanel 吗?

4

2 回答 2

4

循环播放时它们会显示动画。

不要使用 Thread.sleep() 来尝试控制动画。

动画应该使用Swing Timer来完成。

此外,每当我看到删除/添加组件的代码时,它几乎总是错误的。相反,您应该使用CardLayout. 上面的教程还有一个关于如何使用 CardLayout 的部分。

于 2013-04-18T19:53:16.337 回答
0

您在 if 语句中执行相同的操作,这将使更新该操作变得相当困难。如果这确实是您想要的功能,则需要将其更改为:

for (int i = 0; i < 10; i++) {
    boolean resetIndex = false;
    remove(model.getFrame(index));
    if (index == 3) {
        index = 0;
        resetIndex = true;
    }
    System.out.println(index);
    remove(model.getFrame(index));
    revalidate();
    repaint();
    if (!resetIndex && index != 3)
        index++;
    add(model.getFrame(index), BorderLayout.CENTER);
    revalidate();
    repaint();
    Thread.sleep(300);
}

您还应该寻找替换您的revalidateandrepaint调用updateUI,它将正确处理repaint所有孩子的调用,而不是仅将电流引导JComponent到自己绘制。

于 2013-04-18T19:59:15.480 回答