Java - MySQL的定期更新

时间:2013-05-17 06:59:12

标签: java swing jlabel event-dispatch-thread

我正在为我的工作开发记分板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甚至是最好的选择吗?或者我应该尝试别的吗?

2 个答案:

答案 0 :(得分:1)

  1. 您遇到Concurency in Swing的问题,任何创建,更新,修改Swing GUI都必须在Event Dispatch Thread上完成,也许是为了包裹sb.dispose();通过投掷try - catch

  2. 进入NullPointerException
  3. 必须在Initial Thread

  4. 上创建Swing GUI
  5. 没有理由每隔5日重新创建一个新的Top-Level Container。秒,在app的start_up

  6. 上重新添加到contianer中JComponents
  7. 使用util.Timer来调用SwingWorker

答案 1 :(得分:1)

调用constUpdates使当前线程将其置于无限循环中。 如果配置UI正在调用它,它将使UI线程处于无限循环中。 在主函数中使用该循环会更好。

如果你得到一个InteruptedException,你应该突破循环,而不是继续。

你有一个令人兴奋的静态和非静态的东西组合,试着让它变成对象绕过它。

如果您希望配置要求记分板重绘,请将记分板传递给记分板,以便它可以直接调用重绘并保留轮询。