2

EDT で JProgressBar を作成して表示するコードを次に示します。Apple の Java 6 では、進行状況バーがアニメーション化されます。Oracle の Java 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-ea と OS X 10.8.3 を使用しています。

私が間違っていることがわかりますか?そうでない場合、回避策はありますか?

編集:ここにテキスト出力があります:

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

編集:既知の問題のようです

だから今私の質問はこれです:どうすればこの問題を回避できますか?

4

1 に答える 1

1

これは確認済みの JRE バグであるため、回避策はかなりハックなものになります。

進行状況バーを不確定モードでのみ使用している場合 (つまり、実際の進行状況を表示する必要はなく、実行時間の長いタスクがある場合のみ)、代わりにSwingXの JXBusyLabel を使用してみてください。(注:ドキュメントを見つけて頑張ってください...最近はすべてのリンクが壊れているようです)

それができない場合は、タイマーを使用して定期的に再描画を強制する古い 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);
            }
        });        
    }
}
于 2013-01-31T23:35:04.430 に答える