我正在编写一个小函数,它将根据加权随机整数更新我的ProgressBar和JLabel。线程正在睡眠并且随机值正在通过,但是我的进度条和jlabel没有更新。
它也让我的GUI无法响应。它没有完全锁定我的GUI(我可以单击按钮,但它不执行与这些按钮相关的功能)。
不会打印出run()方法中的print语句。所以我认为它永远不会进入那里。
到目前为止,这是我的方法:
private void updateProgressBar(int max) {
final int maxDiamonds = max;
int i = 0;
while(i <= max) {
//get random obstacle found
final Obstacle o = obstacle.next();
System.out.println("Obstacle: " + o.getName());
//get random number of diamonds for obstacle
int numDiamonds = Integer.parseInt(numFoundDiamonds.next());
System.out.println("Number of Diamonds: " + numDiamonds);
//set currentValue for the progress bar
final int currentValue = i;
for(int j = o.getRemovalTime(); j >= 0; j--) {
final int rSecs = j;
System.out.println("Time remaining to remove: " + rSecs);
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setString(currentValue + "/" + maxDiamonds);
statusLabel.setText("Found " + o.getName() + ". Removing: " + rSecs + " s Remaining.");
}
});
java.lang.Thread.sleep(1000);
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
i += numDiamonds;
}
}
也许我忽视了一些简单的事情。
我还可以提供更多关于所用其他类的代码,但我觉得问题在于提供的代码。
答案 0 :(得分:3)
你在Swing事件线程上调用Thread.sleep(...)
,这将使整个Swing线程和应用程序进入休眠状态。使用后台线程,例如使用SwingWorker。