2013-05-17 2 views
0

내 작업을 위해 Scoreboard Java 응용 프로그램을 개발 중입니다. MySQL을 사용하여 스코어 값을 저장하고 Java 응용 프로그램이이를 액세스하여 프로젝터에 표시합니다. 지금까지 Swing을 사용하여 Java 응용 프로그램을 만들었습니다. jLabels를 사용하여 모든 점수를 표시하므로 점수 판을 완전히 다시 그려야 업데이트 할 수 있습니다.Java - MySQL의 정기 업데이트

이제 스코어 보드를 정기적으로 업데이트해야합니다. Thread.sleep을 사용하려고 시도했지만 스레드를 인터럽트하는 방법을 모르겠습니다. 스레드를 중단해야하는 이유는 점수 판에 표시 할 항목 수가 구성 패널에서 변경되는 경우 오른쪽 nummber를 표시하기 위해 점수 판을 다시 그려야하기 때문입니다.

현재 sleep은 아무 것도 만지지 않는 한 코드에서 잘 작동합니다. 그러나 내가 무언가를 변경하자마자, ConfigPanel 일이 잘못되어 버립니다. connfiguration이 redrawScoreboard()을 변경되었습니다

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이 호출 될 때 constUpdates이 계속해서 5000으로 계산되는 동안 큐에 대기합니다. sleep을 어떻게 중단하여 스코어 보드를 다시 그릴 수 있습니까? sleep도 가장 좋은 옵션입니까? 아니면 다른 것을 시도해야합니까?

+0

언제든지'javax.swing.Timer'를 체크 아웃 할 수 있습니다. 나는 또한 [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 살펴볼 것입니다. 잠정적 인 EDT 위반이 있기 때문에 ... – MadProgrammer

답변

1
  1. 당신은 스윙의 GUI는, sb.dispose()에 포장하는 아마 이유 Event Dispatch Thread에서 수행해야합니다, 수정, 작성, 업데이트, Concurency in Swing에 문제가있다; try - catch에 의해이 NullPointerException

  2. 스윙 GUI가 새로운 Top-Level Container 모든 5를 다시가 Initial Thread

  3. 아무 이유에 작성해야합니다 발생합니다. 초, JComponents 재사용하는 것은

+0

감사합니다. 모든 링크. 나는 SwingWorker와 Concurency를 연구 중이다.FTR, updateScores는 새로운 Top-Level Container를 생성하지 않습니다. TLC에 대한 지식으로는 멋진 JLabel에 대해서만'setText'를 수행합니다. – MowgliB

1

호출 constUpdates는 현재 스레드이 무한 루프에 넣습니다 소요, 응용 프로그램의 start_up

  • SwingWorker를 호출하는 데 사용할 util.Timer에 contianer에 추가. 구성 UI가 호출하는 경우 UI 스레드를 무한 루프에 배치합니다. main 함수에서 루프를 사용하는 것이 좋습니다.

    InteruptedException이 발생하면 계속 진행하지 말고 루프에서 빠져 나가야합니다.

    당신은 정적 인 것들과 비 정적 인 것들이 혼재되어 있습니다. 대신에 객체들이 대신 arround를 통과하도록 만들어보십시오.

    config로 채점 게시판에 다시 그리기를 요청하려면 채점 보드에 전달하여 직접 다시 그리기를 호출하고 폴링을 그대로 둡니다.