为了账号安全,请及时绑定邮箱和手机立即绑定

SwingWorker 不更新长进程

SwingWorker 不更新长进程

DIEA 2021-09-15 15:07:12
我正在使用 SwingWorker 和当过程不是太繁重时,它会完美地更新 JProgressBar(例如包含 62 个元素的“Trames”列表)当进程繁重时,它不会更新 JProgressBar(我用 100k 个元素进行了测试,它最终可以使用 2M+ elems)在我的 ProgressWorker 类下面@Overrideprotected Object doInBackground() throws Exception {    // TODO Auto-generated method stub    // here process i skipped    for (Trame t : trames) {        float progress = (float)FileRW.tramescounter/FileRW.maxtrames;        progress = progress*100;        int p = (int) progress;        setProgress(p);        System.out.println(getProgress()+"+p"+" ---- progress"+p+" ---- double"+progress);        Thread.sleep(25);        FileRW.tramescounter++;        // here process i skipped    }    // here process i skipped    return null;}   此外,我的控制器类:ProgressWorker pw = new ProgressWorker();pw.addPropertyChangeListener(new PropertyChangeListener() {    @Override    public void propertyChange(PropertyChangeEvent evt) {        String name = evt.getPropertyName();        if (name.equals("progress")) {            int progress = (int) evt.getNewValue();            Vue.bar.setValue(progress);            Vue.bar.repaint();        } else if (name.equals("state")) {            SwingWorker.StateValue state = (SwingWorker.StateValue) evt.getNewValue();            switch (state) {                case DONE:                    Vue.lastButton.setEnabled(true);                    if (Vue.check.isSelected()) {                        if (Desktop.isDesktopSupported()) {                            Desktop desktop = Desktop.getDesktop();                            try {                                desktop.open(new File(Constants.FICHIER_LOG2));                            } catch (IOException e) {                                // TODO Auto-generated catch block                                e.printStackTrace();                            }                        }                    }
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

好吧,没关系,问题不是我所期望的


就在我跳过的代码的第一部分中,我写了


Vue.bar.setMaximum(trames.size());

更远,


float progress = (float)FileRW.tramescounter/FileRW.maxtrames;

progress = progress*100;

int p = (int) progress;

setProgress(p);

在控制器类中


Vue.bar.setValue(progress);

但是 ProgressWorker 中设置的进度值是从 0 到 100


我的最大 ProgressBar 值为 100K,但 0 < 进度值 <100,


没有进展很正常


查看完整回答
反对 回复 2021-09-15
  • 2 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信