栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何将jProgress栏用于ProcessBuilder进程?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何将jProgress栏用于ProcessBuilder进程?

Swing是一个单线程环境,它也不是线程安全的。

这意味着任何长时间运行或阻塞的进程都不应在“事件调度线程”的上下文中运行,因为它将阻止其处理新事件,包括重绘请求,从而使程序看起来像已挂起。

这也意味着您永远不要在EDT上下文之外创建或修改ANY UI组件的状态。

有关更多详细信息,请参见Swing中的并发。

您可以使用

Thread
在其中运行该过程,但是您将负责确保要对UI进行的任何更改都在EDT上下文中手动进行。特别是当您要将信息从线程传递到EDT时,这可能会变得很麻烦。

另一个解决方案是使用,

SwingWorker
它提供的功能可以更轻松地在其后台线程和EDT之间同步数据。它支持通过
setProgress
方法和支持进行进度通知
PropertyListener
,以及
publish
从后台线程和
process
EDT上下文中获取数据的功能。它还有一个很好的
done
方法,可以让您知道后台线程何时完成,但是可以在EDT的上下文中执行,例如…

public static class FormatWorker extends SwingWorker<Integer, Integer> {    private String drive;    public FormatWorker(String drive) {        this.drive = drive;    }    @Override    protected Integer doInBackground() throws Exception {    String[] command = {"CMD", "/C", "MyCmdCommand"};    ProcessBuilder probuilder = new ProcessBuilder(command);    probuilder.directory(new File(drive + ":\"));    Process process = probuilder.start();    return process.waitFor();        return 0;    }}

现在,您可能很想将传递

JProgressBar
给,
SwingWorker
并在
done
方法中重置其状态,但这确实使它挂了一点,不知道工作程序实际上是什么时候开始的,当然,您应该在调用之前设置状态。工作人员,但管理UI状态不是工作人员的责任

相反,您可以利用工人的

PropertyChangeListener
支持,例如…

    PropertyChangeListener listener = new PropertyChangeListener() {        @Override        public void propertyChange(PropertyChangeEvent evt) { System.out.println(evt.getPropertyName() + "; " + evt.getNewValue()); if ("state".equals(evt.getPropertyName())) {     SwingWorker.Statevalue state = (SwingWorker.Statevalue) evt.getNewValue();     switch (state) {         case DONE:  try {      int exitLevel = ((SwingWorker<Integer, ?>)evt.getSource()).get();      JOptionPane.showMessageDialog(null, "Format command completed with exit level of " + exitLevel);  } catch (InterruptedException | ExecutionException ex) {      JOptionPane.showMessageDialog(progressBar, ex.getMessage());  } finally {      progressBar.setIndeterminate(true);  }  break;         case STARTED:  progressBar.setIndeterminate(true);  break;     } }        }    };    FormatWorker worker = new FormatWorker("G");    worker.addPropertyChangeListener(listener);    worker.execute();

这使您可以决定如何响应工作人员,而无需将您与特定的工作流程联系在一起。

请参阅工作线程和SwingWorker



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469719.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号