2013-05-17 2 views
0

Я разрабатываю приложение Java Scoreboard для своей работы. Он использует MySQL для хранения значений оценки, а приложение Java обращается к ним и отображает их на проекторе. До сих пор мне удалось создать приложение Java с помощью Swing. Я показываю все оценки с помощью jLabels, чтобы их можно было обновить без полной перерисовки табло.Java - периодические обновления от MySQL

Теперь мне нужно периодически обновлять табло. Я попытался использовать 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 
      } 
     } 
    } 

} 

Когда connfiguration был изменен redrawScoreboard() называется.

В тот момент, когда redrawScoreboard называется он просто сидит в очереди, пока constUpdates продолжает считать до 5000. Как прервать sleep так что я могу перекроить табло. Есть sleep даже лучший вариант здесь? Или я должен попробовать что-то еще?

+0

Проверьте 'javax.swing.Timer' вы можете« остановить »это, когда захотите. Я также проверил [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/), так как у вас есть некоторые потенциальные нарушения EDT, которые происходят там ... – MadProgrammer

ответ

1
  1. у вас есть проблемы с Concurency in Swing, любое создание, обновление, изменение Качели GUI должно быть сделано на Event Dispatch Thread, может быть причиной для упаковки sb.dispose(); в try - catch по бросками NullPointerException

  2. Качели GUI должен быть создан на Initial Thread

  3. там нет причины, чтобы воссоздать новый Top-Level Container каждый 5-ый. секунд, повторно JComponents добавлены в contianer на start_up приложения

  4. использование util.Timer для вызова SwingWorker,

+0

Спасибо за все ссылки. Сейчас я изучаю SwingWorker и Concurency.FTR, 'updateScores' не создает новый контейнер верхнего уровня (насколько я знаю TLC), он просто выполняет' setText' на всех этих отличных 'JLabels'. – MowgliB

1

Вызова constUpdates принимает текущий поток помещает его в бесконечном цикле. Если пользовательский интерфейс конфигурации вызывает его, он поместит поток пользовательского интерфейса в бесконечный цикл. Лучше просто иметь эту петлю в основной функции.

Если вы получаете InterptedException, вы должны выйти из цикла, а не продолжать.

У вас есть пьянящее сочетание статических и нестатических вещей, попробуйте сделать так, чтобы объекты проходили вместо arround.

Если вы хотите, чтобы конфигурация запрашивала табло для перерисовки, пропустите его на табло, чтобы он мог вызвать перерисовку напрямую и оставить опрос в одиночку.

Смежные вопросы