java progress_java – 如何使用jProgress栏进行ProcessBuilder进...

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

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

这也意味着您永远不应该在EDT的上下文之外创建或修改任何UI组件的状态.

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

另一种解决方案是使用SwingWorker,它提供的功能可以更容易地在它的后台线程和EDT之间同步数据.它通过setProgress方法和PropertyListener支持支持进度通知,以及在EDT上下文中从后台线程和进程发布数据的功能.它还有一个很好的done方法,可以让你知道后台线程何时完成,但是在EDT的上下文中执行,例如…

public static class FormatWorker extends SwingWorker {

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)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();

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值