代码之家  ›  专栏  ›  技术社区  ›  Eternal Noob

在循环中重新绘制

  •  2
  • Eternal Noob  · 技术社区  · 15 年前

    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();
    }
    
    2 回复  |  直到 15 年前
        1
  •  6
  •   Cameron Skinner    15 年前

    你可以用 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();
    }
    

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

        2
  •  2
  •   drekka    15 年前

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

    1. 在你睡觉之前(我不建议这么做),触发事件循环来强制重新绘制。我得查一下。我记不得怎么做了。:-)

    我可能会认为1是最好的选择。