我正在为我的工作开发一个记分板 Java 应用程序。它使用 MySQL 来存储分数值,Java 应用程序访问它们并将它们显示在投影仪上。到目前为止,我已经成功地使用 Swing 创建了一个 Java 应用程序。我使用 jLabels 显示所有分数,以便可以更新它们,而无需完全重新绘制记分板。
现在,我需要定期更新记分板。我尝试使用 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 是最好的选择吗?或者我应该尝试其他方法?
最佳答案
您对Concurency in Swing有疑问,任何创建、更新、修改 Swing GUI 都必须在事件调度线程上完成,这可能是包装 sb.dispose() 的原因;通过抛出
NullPointerException
进入try - catch
Swing GUI 必须在 Initial Thread 上创建
没有理由重新创建新的 Top-Level Container每 5 次。秒,重用在应用启动时添加到容器的
JComponents
使用util.Timer调用SwingWorker ,
关于Java - 来自 MySQL 的定期更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16603236/