【问题标题】:Joining JProgressBar and JTextArea (batch running console) in Eclipse在 Eclipse 中加入 JProgressBar 和 JTextArea(批量运行控制台)
【发布时间】:2017-01-03 09:46:47
【问题描述】:

您好,我在将 JtextAreaJProgressBar 结合时遇到了一些问题。 JtextArea 正在显示批处理运行脚本的控制台。这是我的代码:-

private void initialize() {
        frmPdfPublisher = new JFrame();
        frmPdfPublisher.setIconImage(new ImageIcon("C:\\Users\\Admin\\Desktop\\imageedit_1_6449501097.png").getImage());
        frmPdfPublisher.setTitle("PDF Publisher");
        frmPdfPublisher.setBounds(100, 100, 483, 540);
        frmPdfPublisher.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmPdfPublisher.getContentPane().setLayout(null);
        
        
        TextArea textArea = new TextArea();
        textArea.setBounds(10, 280, 447, 146);
        frmPdfPublisher.getContentPane().add(textArea);
        textArea.setEditable(false);
        
        
        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setBounds(10, 280, 447, 146);
        frmPdfPublisher.getContentPane().add(scrollPane);
        
        
        JProgressBar progressBar = new JProgressBar();
        progressBar.setBounds(10, 254, 447, 14);
        frmPdfPublisher.getContentPane().add(progressBar);
        progressBar.setVisible(true);
        
    
        
        JButton btnTransform = new JButton("Transform");
        btnTransform.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                String cmds[] = {"C:\\Users/Admin/Desktop/test1.bat"};
                Runtime runtime = Runtime.getRuntime();
                Process process = runtime.exec(cmds);
                process.getOutputStream().close();
                java.io.InputStream inputStream = process.getInputStream() ;
                InputStreamReader inputstreamreader = new InputStreamReader(inputStream);
                BufferedReader bufferedrReader = new BufferedReader(inputstreamreader);
                String strLine = "";
                while ((strLine = bufferedrReader.readLine()) != null) {
                    System.out.println(strLine);
                    String newline = "\n";
                    textArea.append(strLine+newline);
                    textArea.setCaretPosition(textArea.SCROLLBARS_VERTICAL_ONLY);
                    progressBar.setString(strLine);
                    
                    
                
            }
            } catch (IOException IoException) {
                IoException.printStackTrace();
            }
            }
                
        });

我也想在 JprogressBar 中显示正在运行的脚本。 我正在使用 Eclipse Neon.2

编辑:-

我添加了几个步骤,但它没有显示完美的加载,并且在控制台停止后立即完成。

这是编辑后的代码:-

JButton btnTransform = new JButton("Transform");
        btnTransform.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                try {
                String cmds[] = {"C:\\Users/Admin/Desktop/test1.bat"};
                Runtime runtime = Runtime.getRuntime();
                Process process = runtime.exec(cmds);
                process.getOutputStream().close();
                java.io.InputStream inputStream = process.getInputStream() ;
                InputStreamReader inputstreamreader = new InputStreamReader(inputStream);
                BufferedReader bufferedrReader = new BufferedReader(inputstreamreader);
                String strLine = "";
                int n=progressBar.getValue();
                if(n<100){
                    n++;
                    progressBar.setValue(100);
                }
                else{
                    timer.cancel();
                }
                while ((strLine = bufferedrReader.readLine()) != null) {
                    System.out.println(strLine);
                    String newline = "\n";
                    textArea.append(strLine+newline);
                    textArea.setCaretPosition(textArea.SCROLLBARS_VERTICAL_ONLY);
                    progressBar.setStringPainted(true);
                    progressBar.dispatchEvent(e);   
                    progressBar.getValue();
                    progressBar.updateUI();

            }
            } catch (IOException IoException) {
                IoException.printStackTrace();
            }
            }

请纠正我,我错过了什么?

【问题讨论】:

  • 当你有你想要的东西时,记得接受一个答案。

标签: java eclipse swing windowbuilder jprogressbar


【解决方案1】:

现在,您的 exec() 调用正在阻塞事件调度线程。您需要运行background 中的命令,就像它们显示here 一样。如果您想在批处理文件运行时查看每一行的进度,您需要逐行读取批处理文件,分别执行每一行并publish() 结果就像他们显示here .如果您在后台的每一行之后调用setProgress(),则会更新一个收听进度条,就像他们显示here一样。

我希望我的进度条根据批处理文件运行时执行过程和n 完成100% 工作。

您需要阅读所有行才能知道有多少行。然后你可以像他们显示的那样设置进度here

setProgress(i * (100 / n));

其中i 是当前正在执行的行号,n 是总行数。例如,如果有十行,则每次调用后进度条都会增长十分之一。

【讨论】:

  • 我可以在我的文本区域中显示控制台,现在我只想在运行时读取该控制台并同时在进度条中显示它。
  • 我不认为计时器会为此工作;批处理文件中的每个步骤可能需要不同的时间。
  • 它正在使用 angular, hta javascript ,但我不知道在 java 中读取批处理
  • 您的readLine() 看起来工作正常;你只需要在后台一次执行一行。
  • 是的,我的 readLine() 工作正常,我不知道 java 中的后台读取行过程。我有一点,但我卡在计时器部分。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多