2013-01-30 6 views
2

Вот код, который создает и отображает JProgressBar на EDT. На Apple Java 6 индикатор прогресса активизируется. В Oracle, Java 7, он не делает:JProgressBar не анимируется ТОЛЬКО на Mac с Java 1.7

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); 
      } 
     }); 

    } 
} 

Чтобы быть точным, я использую Java 1.7.0_12-еа и OS X 10.8.3.

Вы видите что-то, что я делаю неправильно? Если нет, есть ли работа?

Edit: вот выводимый текст:

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

Edit: 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, обходные пути будут довольно хакерскими.

Если вы используете только индикатор выполнения в неопределенном режиме (другими словами, вам не нужно показывать реальный прогресс, просто потому, что есть многолетняя задача), попробуйте вместо этого использовать JXBusyLabel SwingX. (Примечание: удачная находка документации ... все ссылки, кажется, нарушены в настоящее время)

Если это не вариант, вы можете попробовать старый подход VB6 использовать таймер для периодической принудительной перерисовки. Наивысшая реализация:

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

Принудительный вызов перекраски не решил проблему - но это хорошая идея. На данный момент использование JXBusyLabel может быть достаточно хорошим решением. И, поскольку судьба имела бы это, у меня уже есть swingx в моем проекте, и все источники и документы для него, включая JXBusyLabel. –