Swing JProgressBar 没有像我期望的那样重新绘制

发布于 2024-09-27 07:32:01 字数 417 浏览 8 评论 0原文

大家好,我有一个非常简单的问题,应该有人能够帮助我解决。我想要的只是一个带有更新进度条的小框架,现在它没有更新:

final JProgressBar bar = new JProgressBar(0,250000);
bar.setValue(1000);
bar.setIndeterminate(false);
JOptionPane j = new JOptionPane(bar);
final JDialog d = j.createDialog(j,"Expierment X");
d.pack();
d.setVisible(true);
bar.setValue(40000);

40,000 值没有显示,只有可怜的 1000。我宁愿不必编写任何类来处理重绘调用或无论涉及什么(永远没有使用 Swing)。

谢谢!

Hey all, I have a pretty simple problem someone should be able to help me with. All I want is a small frame with a progress bar that updates, right now it's not updating:

final JProgressBar bar = new JProgressBar(0,250000);
bar.setValue(1000);
bar.setIndeterminate(false);
JOptionPane j = new JOptionPane(bar);
final JDialog d = j.createDialog(j,"Expierment X");
d.pack();
d.setVisible(true);
bar.setValue(40000);

The 40,000 value doesn't show up, only the measly 1000. I'd prefer to not have to write any classes to handle repaint calls or whatever is involved in doing that (haven't used Swing in forever).

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一刻暧昧 2024-10-04 07:32:01

这是因为 createDialog 会阻塞,因此直到您在对话框上单击“确定”后才会调用 bar.setValue

您应该在不同的线程中更新进度条。

例如:

    final JProgressBar bar = new JProgressBar(0,250000);
    bar.setValue(1000);
    bar.setIndeterminate(false);
    JOptionPane j = new JOptionPane(bar);

    Thread t = new Thread(){
        public void run(){
            for(int i = 1000 ; i < 250000 ; i+=10000){
                bar.setValue(i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }
            }
        }
    };
    t.start();

    final JDialog d = j.createDialog(j,"Expierment X");
    d.pack();
    d.setVisible(true);

This is because createDialog blocks so bar.setValue will not be called until you hit OK on the dialog.

You should update the progress bar in a different thread.

For example:

    final JProgressBar bar = new JProgressBar(0,250000);
    bar.setValue(1000);
    bar.setIndeterminate(false);
    JOptionPane j = new JOptionPane(bar);

    Thread t = new Thread(){
        public void run(){
            for(int i = 1000 ; i < 250000 ; i+=10000){
                bar.setValue(i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }
            }
        }
    };
    t.start();

    final JDialog d = j.createDialog(j,"Expierment X");
    d.pack();
    d.setVisible(true);
把时间冻结 2024-10-04 07:32:01

您需要确保从事件调度线程调用 setValue 方法。您可以使用 SwingUtilities.invokeLater 来实现此目的。

You need to make sure that the setValue method gets called from the Event Dispatch Thread. You can use SwingUtilities.invokeLater for that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文