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 回答