Java 小程序 : JProgressBar updating/refreshing only at completion

标签 java swing applet jprogressbar swingutilities

我只是尝试在 for 循环中迭代并更新循环内 JProgressBar 的值,启动 SwingUtilities.invokeLater.. 但它仅在完成后更新。 下面是我的简单代码:

import java.awt.Color;
import java.awt.Rectangle;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ProgressBar extends JApplet {
    JProgressBar pg = null;
    JPanel panel = null;
    JButton start = null;
    int i;

    public void init() {
        pg = new JProgressBar(0, 100);
        pg.setStringPainted(true);
        this.setSize(1200, 600);
        this.setLayout(null);
        panel = new JPanel();
        panel.setLayout(null);
        panel.setBackground(Color.white);
        this.setContentPane(panel);
        this.setVisible(true);
        pg.setBounds(new Rectangle(630, 20, 150, 30));
        add(pg);


        start = new JButton("start");
        start.setBounds(new Rectangle(330, 20, 200, 30));
        start.setBackground(Color.lightGray);
        panel.add(start);

        start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                pg.setValue(0);
                pg.setStringPainted(true);

                for (i = 0; i <= 100; i = i + 1) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            try {
                                pg.setValue(i);
                                java.lang.Thread.sleep(100);
                            } catch (Exception e) {}
                        }
                    });
                }
            }
        });
    }
}

如何以增量方式反射(reflect) 进度条 的更新,因为它在 for 循环完成后仅更新 100%

最佳答案

您必须在单独的线程中处理任何计算/处理内容,并在事件调度线程 (EDT) 中更新 UI:

    start.addActionListener ( new ActionListener ()
    {
        public void actionPerformed ( ActionEvent e )
        {
            pg.setValue ( 0 );
            pg.setStringPainted ( true );
            new Thread ( new Runnable ()
            {
                public void run ()
                {
                    for ( i = 0; i <= 100; i = i + 1 )
                    {
                        SwingUtilities.invokeLater ( new Runnable ()
                        {
                            public void run ()
                            {
                                pg.setValue ( i );
                            }
                        } );
                        try
                        {
                            java.lang.Thread.sleep ( 100 );
                        }
                        catch ( Exception e )
                        {
                            //
                        }
                    }
                }
            } ).start ();

        }
    } );

任何 Action /鼠标/键和其他监听器方法始终在 EDT 线程中执行,因此您必须将代码移至单独的线程中。否则,您将在 EDT 线程内进行所有计算/处理(这会导致 UI 卡住)。

关于Java 小程序 : JProgressBar updating/refreshing only at completion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260977/

相关文章:

java - 使用 Java EE 保留我的第一个实体

java - 无法在 Java 中为 "final"变量赋值

java - 在我的网站上查看 Applet 更新时出现问题

java - 如何导出 PApplet 以使其可在浏览器中运行?

java - 导入 keystore 以签署小程序

java - 从 Play 2.4.1 迁移到 2.5.6 - 套接字

java - 如何分析Websphere core*.dmp文件和Snap*.trc文件?

Java:如何忽略具有 null 的字段并仅通过修改后的属性传递

单击按钮时java swing jpanel显示

java - 如何自定义 JSplitPane 分隔线并保持一键式箭头功能?