0

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

4

2 回答 2

1
  1. 在 Swing 中遇到 Concurency问题,任何创建、更新、修改 Swing GUI 都必须在上完成Event Dispatch Thread,也许是包装的原因sb.dispose()try - catch投掷_NullPointerException

  2. Swing GUI 必须在初始线程上创建

  3. 没有理由每 5 次重新创建一个新的顶级容器。秒,重用JComponents添加到应用程序的 start_up 上的 contianer

  4. 使用util.Timer调用SwingWorker

于 2013-05-17T07:15:59.760 回答
1

调用 constUpdates 会将当前线程置于无限循环中。如果配置 UI 正在调用它,它会将 UI 线程置于无限循环中。最好在 main 函数中有这个循环。

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

你有一个令人兴奋的静态和非静态事物的混合,试着让它让物体得到传递。

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

于 2013-05-17T07:21:34.347 回答