java - 从新线程更新 JProgressBar

标签 java multithreading jprogressbar

如何从另一个线程更新 JProgressBar.setValue(int) ? 我的第二个目标是用尽可能少的类(class)来完成它。

这是我现在拥有的代码:

// Part of the main class....
pp.addActionListener(
        new ActionListener(){
            public void actionPerformed(ActionEvent event){
                new Thread(new Task(sd.getValue())).start(); 
            }
        });

public class Task implements Runnable {
    int val;
    public Task(int value){
        this.val = value;
    }

    @Override
    public void run() {
        for (int i = 0; i <= value; i++){ // Progressively increment variable i 
            pbar.setValue(i); // Set value 
            pbar.repaint(); // Refresh graphics 
            try{Thread.sleep(50);} // Sleep 50 milliseconds 
            catch (InterruptedException err){} 
        } 
    }
}

pp 是一个 JButton,单击 JButton 时启动新线程。

pbar 是 Main 类中的 JProgressBar 对象。

如何更新其值?(进度)

上面的 run() 代码看不到 pbar。

最佳答案

始终遵守 swing 的规则

一旦实现了 Swing 组件,所有可能影响或依赖于该组件状态的代码都应该在事件分派(dispatch)线程中执行。

你可以做的是创建一个观察者来更新你的进度条 - 例如 - 在这种情况下,您希望显示单击按钮时加载数据的进度。 DemoHelper 类实现 Observable 并在加载一定百分比的数据时向所有观察者发送更新。 进度条通过 public void update(Observable o, Object arg) {

更新
class PopulateAction implements ActionListener, Observer {

    JTable tableToRefresh;
    JProgressBar progressBar;
    JButton sourceButton;
    DemoHelper helper;
    public PopulateAction(JTable tableToRefresh, JProgressBar progressBarToUpdate) {
        this.tableToRefresh = tableToRefresh;
        this.progressBar = progressBarToUpdate;
    }

    public void actionPerformed(ActionEvent e) {
        helper = DemoHelper.getDemoHelper();
        helper.addObserver(this);
        sourceButton = ((JButton) e.getSource());
        sourceButton.setEnabled(false);
        helper.insertData();
    }

    public void update(Observable o, Object arg) {
        progressBar.setValue(helper.getPercentage());
    }
}

无耻插件:这是来自source from my demo project 欢迎浏览了解更多详情。

关于java - 从新线程更新 JProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2726091/

相关文章:

java - 从证书和私钥创建 .jks 文件

java - File.delete() 不是实际的

java - 是否可以在 regex java 中定义前瞻范围?

java - 如何从 HashMap 中的对象访问该对象的 HashMap。 ( java )

java - 如果子线程在调用get方法之前完成,则Java如何维护将来的任务结果

java - JProgress Bar 未在 SwingWorker 内更新

java - 如何使用 FileChannels transferFrom() 方法监控进度(JProgressBar)?

java - 使用线程发出数据库请求

java - 在 EDT 中运行时显示 JFreeChart 点的性能问题

java - Java 中的多线程,我希望 UI 和代码并行执行