Java - invokeAndWait - 如何使用它?

时间:2016-10-29 16:08:23

标签: java swing

我在这里循环:

for(int i=0; i<=10; i++)
            {
            a = r.nextInt(y - x + 1) + x;
            label5.setText("Losowanie... " + a);
            try {
                Thread.sleep(100);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }

            }

我想使用invokeAndWait每次都将“a”放到label5(循环),我不知道如何使用它。有人可以告诉我这个吗?

3 个答案:

答案 0 :(得分:2)

您不想使用invokeAndWait()。这无济于事,因为你仍在使用Thread.sleep(),这意味着在循环执行完毕之前,GUI无法重新绘制自己。

相反,您需要使用Swing Timer

在阅读了Timer基础知识的教程之后,您还可以查看:Update a Label with a Swing Timer,这是一个简单的例子。

答案 1 :(得分:2)

假设这是在后台线程中完成的,您首先不会使用invokeAndWait,而是使用invokeLater。您将label5.setText(...)打包在Runnable中并将其传递给invokeLater(...)

for(int i=0; i<=10; i++) {
    // made final to pass into inner class
    final int finalA = r.nextInt(y - x + 1) + x;
    SwingUtilities.invokeLater(() -> {
        label5.setText("Losowanie... " + finalA);
    });
    try {
        Thread.sleep(100);
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
}

更好的解决方案,如果代码在事件线程中,那么只需使用Swing Timer

int delay = 100;
new Timer(delay, new ActionListener() {
    private int i = 0;
    private final maxI = 10;

    public void actionPerformed(ActionEvent e) {
        if (i < maxI) {
            String a = r.nextInt(y - x + 1) + x;
            label5.setText("Losowanie... " + a);
        } else {
            ((Timer) e.getSource()).stop();
        }
        i++;
    }
}).start();

答案 2 :(得分:-1)

for(int i=0; i<=10; i++)
            {
                a = r.nextInt(y - x + 1) + x;
                label5.setText("Losowanie... " + a);
                Timer timer = new Timer(100, this);
                timer.start(); 

            }

就像那样,不起作用。

像这样,工作,但一直循环之后......

Timer timer = new Timer(100, new ActionListener()
                     {
                     @Override
                     public void actionPerformed(ActionEvent e)
                     {
                         for(int i=0; i<=10; i++)
                            {
                                a = r.nextInt(y - x + 1) + x;
                                label5.setText("Losowanie... " + a);  
                            }
                     }
                     });
             timer.start();