2011-03-02 1 views
2

먼저 Java Concurrency 패키지를 사용하고 있지만 요즘에는 문제가 있다는 것을 발견했습니다. 내가 갖고 싶은 응용 프로그램과 응용 프로그램은 상태 표시 줄과 다른 데이터로드로 SplashScreen을 가질 수 있습니다. 그래서 SwingUtilities.invokeAndWait(call the splash component here)을 사용하기로 결정했습니다. SplashScreenJProgressBar과 함께 나타나고 스레드 그룹을 실행합니다. 하지만 나는 사물을 잘 처리하지 못하는 것 같습니다. SwingWorker을 살펴본 결과,이 목적으로 사용하려고 시도했지만 스레드가 반환됩니다. 다음은 약간의 의사 코드입니다. 그리고 내가 달성하려고 노력하고있는 점들. 업데이트 가능한 JProgressBar로 Java 스윙 스레딩

  • SplashScreen
  • 에서 여러 스레드를 실행할 수 있습니다 정보를
  • 를로드하는 동안 일시 정지 SplashScreen이있는 응용 프로그램을 모든 스레드가 될 때까지 SplashScreen 업데이트-수 아직 출구의 진행률 표시 줄 끝난.

시작 화면에게 내가 스레드 CountDownLatch를 용의 등을 사용하여, SwingWorkers 등 많은 것들을 시도

SplashScreen extends JFrame implements Runnable{ 

    public void run() { 
     //run threads 
     //while updating status bar 
    } 
} 

try { 
    SwingUtilities.invokeAndWait(SplashScreen); 
} catch (InterruptedException e) { 
} catch (InvocationTargetException e) { } 

시작 화면 건설을 시작. CountDownLatch는 실제로 처리하고 싶은 방식으로 작동했지만 GUI를 업데이트 할 수 없었습니다. SwingWorkers을 사용할 때 invokeAndWait은 기본적으로 무효화되었지만 (목적은) PropertyChangedListener을 사용하는 경우에도 여전히 GUI를 업데이트하지 않습니다. 다른 사람이 몇 가지 아이디어가 있다면 듣는 것이 좋을 것입니다. 미리 감사드립니다.

나는 실제로 더 나은 코드를 게시하여 내 솔루션을 찾을 준비가되었습니다. 도와 주신 모든 분들께 감사드립니다.

+1

[SSCCE] (http://SSCCE.org)를 만들고 게시 할 수 있다면 문제가 더 신속하고 정확하게 해결 될 수 있습니다. –

+0

미안하지만, 내가 게시 한 것처럼 침대로 향하고 있었고, 내가 가지고있는 모든 것은 상당히 추악한 코드 였기 때문에 아이디어를 가로막을 수 있었으면 좋겠다. 아래 답변이 나를 위해 작동하지 않으면 실제 코드를 게시 할 것이다. 추천 해 주셔서 감사합니다. – ars265

답변

0

invokeAndWait 내에서 프레임을 호출 할 필요가 없지만 이와 같이 진행 상태 막대 상태를 업데이트해야합니다.

try { 
    SwingUtilities.invokeAndWait(new Runnable() { 
    public void run() { 
//update state of the progress bar here 
    } 
    }); 
} catch (InterruptedException e) { 
} catch (InvocationTargetException e) { } 
+0

고맙습니다. 도움을 청하면 시험해 보겠습니다. – ars265

+0

스레드 또는 SwingWorkers에서이 작업을 수행 할 수 없습니다. 더 나은 코드로 제 질문을 업데이트하고 있습니다. 지금까지 도와 줘서 고마워. – ars265

5

진행 상황을 배경으로 일련의 조작을 실행 및보고를 들어, SwingWorker를 사용합니다.

background 메서드는 백그라운드 처리를 수행합니다.
publish 메서드를 사용하면 정기적 인 상태 업데이트를 게시 할 수 있습니다.
process 메서드를 재정 의하여 업데이트를 처리합니다 (process은 항상 EDT에서 실행 됨).

progressBar = new JProgressBar(); 
sw = new SwingWorker<Boolean,Integer>() { 
    protected Boolean doInBackground() throws Exception { 
     // If any of the operations fail, return false to notify done() 
     // Do thing 1 
     publish(25); // 25% done 
     // Do thing 2 
     publish(50); // 50% done 
     // Do thing 3 
     publish(75); // 75% done 
     // Do thing 4 
     return true; 
    } 
    protected void process(List<Integer> chunks) { 
     for (Integer i : chunks) 
      progressBar.setValue(i); 
    } 
    protected void done() { 
     try { 
      boolean b = get(); 
      if (b) 
       progressBar.setValue(100); // 100% done 
      else 
       // Notify the user processing failed 
     } 
     catch (InterruptedException ex) { 
       // Notify the user processing was interrupted 
     } 
     catch (ExecutionException ex) { 
       // Notify the user processing raised an exception 
     } 
    } 
}; 

부록 :

이, 그것은 당신이 진행 표시 줄을 설정하는 접근 방법 변경이 필요합니다 여러 작업을 확장 할 수 있습니다. 여기에 떠오르는 것이 있습니다 :

작업 당 하나씩 완료 카운터 배열이 있습니다.

int[] completions = new int[numTasks]; 
Arrays.fill(completions,0); 

각각 인덱스 번호가 전달 된 SwingWorkers를 시작하십시오.process 또는 done 메서드는 다음과 같이 전체 진행률 표시 줄을 업데이트합니다.

void update(int index, int percComplete) { 
    completions[index] = percComplete; 
    int total = 0; 
    for(int comp: completions) 
     total += comp/numTasks; 
    overallPB.setValue(total); 
} 

선택적으로 작업마다 JProgressBar를 표시하십시오.

부록 2 : 작업이 완료 시간에 차이가있는 경우

(예를 들어, 캐시 캐시 미스 대 히트), 당신은 ProgressMonitor을 조사 할 수 있습니다. 작업이 일부 (구성 가능한 기본값 500ms) 이상 소요되는 경우에만 나타나는 진행 대화 상자입니다.

+0

이것은 작동하지 않는 것 같습니다. 여러 스윙 작업자가 필요하며 다음 코드 실행이 계속되는 동안 계속 진행합니다. 따라서 invokeAndWait() 메서드를 언급 한 이유는 기다려야하기 때문에 여러 번 필요합니다. SwingWorkers가 실행 중이고 모든 작업자가 완료 될 때까지 계속하고 싶지 않습니다. – ars265