ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

java – 如何使用jProgress栏进行ProcessBuilder进程?

2019-09-26 16:04:14  阅读:256  来源: 互联网

标签:jprogressbar java process swing netbeans


我正在开发一个java应用程序,通过ProcessBuilder执行CMD命令,使usb驱动器可启动.这需要几秒钟,因为我想显示一个jprogressbar来增加GUI,我已经尝试过,我没有,请帮助我.

这是我的代码:

private void btn_StartActionPerformed(java.awt.event.ActionEvent evt)    
{
      String[] command ={"CMD", "/C", "MyCmdCommand"};
      ProcessBuilder probuilder = new ProcessBuilder( command );
      probuilder.directory(new File(dri+":\\"));   

      try 
      {
            Process process = probuilder.start();
            process.waitFor();
      }

      catch(IOException e)
      {
            JOptionPane.showMessageDialog(this, e);
      }
}

我如何在我的代码中使用JProgressbar以及我必须使用的位置?
谢谢

解决方法:

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

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

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

有关详细信息,请参见Concurrency in Swing.

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

另一种解决方案是使用SwingWorker,它提供的功能可以更容易地在它的后台线程和EDT之间同步数据.它通过setProgress方法和PropertyListener支持支持进度通知,以及在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();

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

Worker Threads and SwingWorker

标签:jprogressbar,java,process,swing,netbeans
来源: https://codeday.me/bug/20190926/1820665.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有