2013-01-30 2 views
2

EDT에서 JProgressBar를 만들고 표시하는 코드는 다음과 같습니다. Apple의 Java 6에서는 진행률 막대가 움직입니다. 오라클의 자바 7 일, 그렇지 않습니다 :Java 1.7에서 Mac에서만 JProgressBar 애니메이션이 적용되지 않습니다.

import javax.swing.*; 

public class ScratchSpace { 

    public static void main(String[] args) { 

     System.out.println("java.version = " + System.getProperty("java.version")); 
     System.out.println("java.vm.version = " + System.getProperty("java.vm.version")); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JProgressBar progressBar = new JProgressBar(); 
       progressBar.setIndeterminate(true); 

       JFrame frame = new JFrame(); 
       frame.getContentPane().add(progressBar); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 

    } 
} 

것은 정확히 말하면, 내가 자바 1.7.0_12-EA와 OS X 10.8.3를 사용하고 있습니다.

내가 잘못하고있는 것을 볼 수 있습니까? 그렇지 않은 경우 해결 방법이 있습니까?

편집 : 여기에 텍스트 출력입니다 :

java.version = 1.7.0_12-ea 
java.vm.version = 24.0-b27 

편집 : it seems to be a known problem

그래서 지금은 내 질문은 이것이다 : 어떻게이 문제를 해결할 수 있습니까?

+1

* "내가 잘못하고있는 것을 볼 수 있습니까?"* 내 눈에는 괜찮은 것으로 보입니다. 실제로, 짧은 예제와 결과는 JRE의 버그를 제안합니다. 유사하고 가능한 해결 방법은 [bug DB] (http://bugs.sun.com/)에서 확인하십시오. 아무것도 발견되지 않으면 새로운 보고서를 작성하십시오. –

+0

['java.version' + **'java.vm.version' **] (http://pscode.org/prop/?prop=java.version%2Cjava.vm.version&format=TSV)을 추가 할 수 있습니까? 출력에? 필요하다면 잘 모르겠지만 다치게 할 수는 없습니다. –

답변

1

이것은 확인 된 JRE 버그이므로 해결 방법은 꽤 해킹 될 것입니다.

불확실 모드에서만 진행률 표시 줄을 사용하는 경우 (즉, 장기 실행 작업이라는 것만 큼 실제 진행 상태를 표시 할 필요가 없음) 대신 SwingX의 JXBusyLabel을 사용해보십시오. (참고 : 문서를 찾는 행운을 빌어 요 ... 모든 링크가 깨진 것 같아요.)

이전의 VB6 방식을 사용하면 타이머를 사용하여 주기적으로 다시 그리기를 할 수 있습니다. Naiive 구현 :

import javax.swing.*; 

public class ScratchSpace { 

    public static void main(String[] args) { 

     System.out.println("java.version = " + System.getProperty("java.version")); 
     System.out.println("java.vm.version = " + System.getProperty("java.vm.version")); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final JProgressBar progressBar = new JProgressBar(); 
       progressBar.setIndeterminate(true); 

       int delayMilliseconds = 250; 
       Timer repaintTimer = new javax.swing.Timer(delayMilliseconds, new ActionListener(){ 
        @Override 
        public void actionPerformed(final ActionEvent ae) { 
         progressBar.repaint(); 
        } 
       }); 
       repaintTimer.start(); 

       JFrame frame = new JFrame(); 
       frame.getContentPane().add(progressBar); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     });   
    } 
} 
+0

repaint에 대한 강제 호출로 문제가 해결되지 않았지만 좋은 생각입니다. JXBusyLabel을 사용하면 현재로서는 충분한 솔루션이 될 수 있습니다. 그리고 운명이 그것을 가지고, 나는 이미 JXBusyLabel을 포함한 프로젝트 및 모든 소스와 문서에 swingx 있습니다. –

관련 문제