我正在为我的工作开发记分板Java应用程序。它使用MySQL来存储分数值,Java应用程序访问它们并将它们显示在投影仪上。到目前为止,我已经设法使用Swing创建Java应用程序。我使用jLabel显示所有分数,以便在不完全重绘记分板的情况下更新它们。
现在,我需要让记分板定期更新。我试图使用Thread.sleep
,但我不知道如何中断线程。我需要中断线程的原因是,如果在配置面板上更改了记分板上显示的条目数,则必须重新绘制记分板才能显示正确的数字。
目前sleep
在代码中工作正常,只要我不碰任何东西。但是,只要我改变了ConfigPanel
中的任何内容,就会出错。
package au.thewebeditor.scoreboard.apps;
import java.lang.*;
public class Program {
private static Scoreboard sb;
private static ConfigPanel cp;
public Program(){
sb = new Scoreboard();
cp = new ConfigPanel();
}
public static void redrawScoreboard() throws NullPointerException{
try{
sb.dispose();
} catch (NullPointerException e){
//DO NOTHING
}
sb = new Scoreboard();
try {
cp.toFront();
} catch (NullPointerException e) {
cp = new ConfigPanel();
}
constUpdates();
}
public static void showConfig(){
cp.setVisible(true);
cp.toFront();
}
public static void main(String[] arguments){
new Program();
constUpdates();
}
private static void constUpdates() {
boolean go = true;
while (go){
try {
Thread.sleep(5000);
Scoreboard.updateScores();
} catch (InterruptedException e) {
//DO nothing
}
}
}
}
更改配置后,将调用redrawScoreboard()
。
目前,当redrawScoreboard
被调用时,它只是位于队列中,而constUpdates
一直计数到5000.我如何中断sleep
以便重绘记分板。 sleep
甚至是最好的选择吗?或者我应该尝试别的吗?
答案 0 :(得分:1)
您遇到Concurency in Swing的问题,任何创建,更新,修改Swing GUI都必须在Event Dispatch Thread
上完成,也许是为了包裹sb.dispose()
;通过投掷try - catch
NullPointerException
没有理由每隔5日重新创建一个新的Top-Level Container。秒,在app的start_up
JComponents
使用util.Timer来调用SwingWorker,
答案 1 :(得分:1)
调用constUpdates使当前线程将其置于无限循环中。 如果配置UI正在调用它,它将使UI线程处于无限循环中。 在主函数中使用该循环会更好。
如果你得到一个InteruptedException,你应该突破循环,而不是继续。
你有一个令人兴奋的静态和非静态的东西组合,试着让它变成对象绕过它。
如果您希望配置要求记分板重绘,请将记分板传递给记分板,以便它可以直接调用重绘并保留轮询。