我在这里循环:
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(循环),我不知道如何使用它。有人可以告诉我这个吗?
答案 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();