如果它有任何区别,我正在使用eclipse。我想按一下按钮更新标签10次,我希望它在更新之间等待。我试图在for循环中使用thread.sleep,但是在for循环到达结束之前它不会更新标签。
代码接近。它还有更多代码来指定将标签更改为的内容。
for (int i = 0; i < 10; i++) {
try{
thread.sleep(250);
}catch(InterruptedException ie) {
return;
}
panel.repaint();
}
谢谢,这确实有帮助!
答案 0 :(得分:1)
对于要更新的标签,主GUI事件循环必须轮到它。但我猜你的代码是在主线程中运行的,所以在你的代码完全完成之前不能进行重绘。
您需要做的是将您的睡眠循环放入单独的线程中。
对于此任务,SwingWorker
类可能很有用。
答案 1 :(得分:0)
Swing有一个单独的线程(通常称为Swing线程),并且在该线程中发生所有按钮,重绘,处理,更新等。
这意味着如果您阻止该线程(例如通过在循环中休眠),那么在您完成之前它无法重绘屏幕。
您需要将工作分配到另一个线程,例如使用SwingWorker
或用户Timer
来安排更新。 Swing有一个Timer
类,你可以使用它专为这种情况设计,只需告诉它每250ms回拨一次并在回调中进行更改。
答案 2 :(得分:0)
可能是我没有得到您的确切问题,否则以下是解决方案:
for (int i = 0; i < 10; i++) {
try{
panel.repaint();
thread.sleep(250);
// Or here if you want to wait for 250ms before first update
}catch(InterruptedException ie) {
return;
}
}
Thoguh SwingWorker是更好的选择。将逻辑移到SwingWorker线程上方。示例代码如下:
class Task extends SwingWorker<Void, Void> {
@Override
public Void doInBackground() {
for (int i = 0; i < 10; i++) {
try{
panel.repaint();
thread.sleep(250);
// Or here if you want to wait for 250ms before first update
}catch(InterruptedException ie) {
}
}
return null;
}
/*
* Executed in event dispatching thread
*/
@Override
public void done() {
// Do something if you want at the end of all updates like turn off the wait cursor
}
}