【问题标题】:repaint in a loop循环重绘
【发布时间】:2010-11-08 00:43:43
【问题描述】:

我正在使用 Java Swing 编写游戏。我想在每次循环执行时绘制一个小延迟,以在屏幕上创建级联效果。我相信系统中的效率例程正在将对repaint() 的调用合并为一个调用。无论如何,这些变化都是在总延迟之后立即发生的。是否有某种方法可以强制系统立即重新绘制,然后在循环的每次迭代中延迟?

我的代码:

for(int i=0;i<10;i++){
    JButton[i].setBackground(Color.WHITE);
    JButton[i].repaint();
    Thread.sleep(2000);
    JButton[i].setBackground(Color.GRAY);
    JButton[i].repaint();
}

【问题讨论】:

    标签: java swing repaint


    【解决方案1】:

    您可以使用JComponent.paintImmediately 强制立即重绘。

    编辑:再次阅读您的问题后,我想到您可能正在事件调度线程上执行您的逻辑。这意味着在您的方法返回之前不会执行重绘请求。如果您将代码放入另一个线程,那么这可能会解决问题,并且比使用paintImmediately 好得多。

    void uiFunction() {
        new Thread() {
            public void run() {
                for(int i = 0; i < 10; i++) {
                    final JButton b = buttons[i];
                    SwingUtilities.invokeLater(new Runnable() {
                        b.setBackground(Color.WHITE);
                        b.repaint();
                    }
                    Thread.sleep(2000);
                    SwingUtilities.invokeLater(new Runnable() {
                        b.setBackground(Color.GRAY);
                        b.repaint();
                    }
                }
            }
        }.run();
    }
    

    这有点糊涂,但希望它能让你知道从哪里开始。

    【讨论】:

    • 哦,您必须从 EDT 调用它。 -1.
    • 是的,你知道。不知道为什么你认为这值得一票。是因为我对你的回答投了反对票吗?
    • 呃……是的。因为看起来最初的问题是一切都在事件调度线程上运行。感谢您删除反对票。
    • 感谢大家的 cmets...正如 Derek 所说,这是一个线程问题...我创建了一个新线程,它工作正常...感谢 Cameron 提供用于创建新线程的代码。 @Cameron,它不使用 invokeLater() 方法对我有用,我知道你为什么在那里使用它......很好的解决方案......
    • 请记住,所有 GUI 操作都必须在事件调度线程上执行:这包括 setBackground 调用。这就是使用invokeLater 的原因(您也可以使用invokeAndWait)。
    【解决方案2】:

    不确定我是否在正确的轨道上,但这是线程问题吗?因为睡眠将使当前线程进入睡眠状态。因此,如果重绘在当前线程上,您将有效地排队重绘,持有,然后排队另一个重绘。然后该方法结束,图形线程的事件处理循环触发,执行两次重绘(折叠),使一切同时发生。

    基于这种想法,我认为您可能有两种选择:

    1. 将代码放在第二个线程上,这样它就不会停止主图形线程,也因为这意味着图形线程可以在睡眠发生的同时进行重绘。

    2. 在你睡觉之前(我认为不是很推荐),触发事件循环来强制重绘发生。我得查一下这个。不记得该怎么做。 :-)

    我可能会将#1 视为最佳选择。

    【讨论】:

    • 我有执行此操作的代码,但它得到了 -1ed。我应该取消删除吗?
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2012-08-09
    相关资源
    最近更新 更多