Java 通过swing进度条显示批处理文件执行

Java 通过swing进度条显示批处理文件执行,java,swing,swingworker,jprogressbar,Java,Swing,Swingworker,Jprogressbar,我试图执行一个批处理文件,并通过swing进度条显示其进度。但是stdout.readLine()正在返回null。我想显示输出,但我的InputStream为空。有什么建议或其他方法可以做到这一点吗 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.*; import java.io.BufferedReader; import java.io.IOException; import

我试图执行一个批处理文件,并通过swing进度条显示其进度。但是
stdout.readLine()
正在返回
null
。我想显示输出,但我的
InputStream
为空。有什么建议或其他方法可以做到这一点吗

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.*;

public class SwingWorkerExample {

    private final JLabel statusLabel = new JLabel("Status: ", JLabel.CENTER);
    private final JTextArea textArea = new JTextArea(20, 20);
    private JButton startButton = new JButton("Start");
    private JButton stopButton = new JButton("Stop");
    private JProgressBar bar = new JProgressBar();
    private BackgroundTask backgroundTask;
    private final ActionListener buttonActions = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            JButton source = (JButton) ae.getSource();
            if (source == startButton) {
                textArea.setText(null);
                startButton.setEnabled(false);
                stopButton.setEnabled(true);
                backgroundTask = new BackgroundTask();
                backgroundTask.execute();
                bar.setIndeterminate(true);
            } else if (source == stopButton) {
                backgroundTask.cancel(true);
                backgroundTask.done();
            }
        }
    };

    private void displayGUI() {
        JFrame frame = new JFrame("Swing Worker Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setBorder(
            BorderFactory.createEmptyBorder(5, 5, 5, 5));
        panel.setLayout(new BorderLayout(5, 5));

        JScrollPane sp = new JScrollPane();
        sp.setBorder(BorderFactory.createTitledBorder("Output: "));
        sp.setViewportView(textArea);

        startButton.addActionListener(buttonActions);
        stopButton.setEnabled(false);
        stopButton.addActionListener(buttonActions);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(startButton);
        buttonPanel.add(stopButton);
        buttonPanel.add(bar);

        panel.add(statusLabel, BorderLayout.PAGE_START);
        panel.add(sp, BorderLayout.CENTER);
        panel.add(buttonPanel, BorderLayout.PAGE_END);

        frame.setContentPane(panel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class BackgroundTask extends SwingWorker<Integer, String> {

        private int status;

        public BackgroundTask() {
            System.out.println("state:: "+(this.getState()).toString());
            statusLabel.setText((this.getState()).toString());
        }

        @Override
        protected Integer doInBackground() {

            String[] command = { "cmd.exe", "/C", "Start",
                    "D:\\BackupScripter_cmd_stream.bat" };

            try {
                ProcessBuilder pb = new ProcessBuilder(command);
                pb.redirectErrorStream(true);
                Process p = pb.start();

                //Process p = Runtime.getRuntime().exec(command);
                //System.out.println("exit value: "+ p.exitValue()); 

                String s;
                BufferedReader stdout = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));

                System.out.println("s:: "+stdout.readLine());

                while ((s = stdout.readLine()) != null && !isCancelled()) {
                    System.out.println("s:: "+s);
                    publish(s);
                }
                if (!isCancelled()) {
                    status = p.waitFor();
                }
                p.getInputStream().close();
                p.getOutputStream().close();
                p.getErrorStream().close();
                p.destroy();
            } catch (IOException | InterruptedException ex) {
                ex.printStackTrace(System.err);
            }

            return status;
        }

        @Override
        protected void process(java.util.List<String> messages) {

            System.out.println("messages:: "+messages);
            statusLabel.setText((this.getState()).toString());
            for (String message : messages) {
                textArea.append(message + "\n");
            }
        }

        @Override
        protected void done() {
            statusLabel.setText((this.getState()).toString() + " " + status);
            stopButton.setEnabled(false);
            startButton.setEnabled(true);
            bar.setIndeterminate(false);
        }

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SwingWorkerExample().displayGUI();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.event.*;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入javax.swing.*;
公共类SwingWorkerExample{
专用最终JLabel statusLabel=新JLabel(“状态:”,JLabel.CENTER);
私有最终JTextArea textArea=新JTextArea(20,20);
私有JButton startButton=新JButton(“开始”);
私有JButton stopButton=新JButton(“停止”);
私有JProgressBar=新JProgressBar();
私人背景任务背景任务;
私有最终ActionListener按钮操作=新建ActionListener(){
@凌驾
已执行的公共无效行动(行动事件ae){
JButton source=(JButton)ae.getSource();
如果(源==开始按钮){
textArea.setText(空);
startButton.setEnabled(错误);
stopButton.setEnabled(真);
backgroundTask=新的backgroundTask();
backgroundTask.execute();
bar.setUndeterminate(真);
}else if(source==停止按钮){
backgroundTask.cancel(true);
backgroundTask.done();
}
}
};
私有void displayGUI(){
JFrame=新JFrame(“Swing Worker示例”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel面板=新的JPanel();
小组讨论会(
createEmptyByOrder(5,5,5,5));
面板设置布局(新边框布局(5,5));
JScrollPane sp=新的JScrollPane();
sp.setboorder(BorderFactory.createTitledBorder(“输出:”);
sp.setViewportView(文本区域);
addActionListener(按钮操作);
stopButton.setEnabled(错误);
stopButton.addActionListener(按钮操作);
JPanel buttonPanel=新的JPanel();
按钮面板添加(开始按钮);
按钮面板。添加(停止按钮);
按钮面板。添加(条);
panel.add(状态标签、边框布局、页面开始);
面板.添加(sp,BorderLayout.CENTER);
面板。添加(按钮面板,边框布局。第页\结束);
frame.setContentPane(面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
私有类BackgroundTask扩展SwingWorker{
私人身份;
公共背景任务(){
System.out.println(“状态::”+(this.getState()).toString());
statusLabel.setText((this.getState()).toString());
}
@凌驾
受保护整数doInBackground(){
String[]command={“cmd.exe”、“/C”、“Start”,
“D:\\BackupScripter\u cmd\u stream.bat”};
试一试{
ProcessBuilder pb=新的ProcessBuilder(命令);
pb.重定向错误流(真);
进程p=pb.start();
//进程p=Runtime.getRuntime().exec(命令);
//System.out.println(“退出值:+p.exitValue());
字符串s;
BufferedReader标准输出=新的BufferedReader(
新的InputStreamReader(p.getInputStream());
System.out.println(“s::”+stdout.readLine());
而((s=stdout.readLine())!=null&&!isCancelled()){
System.out.println(“s::”+s);
出版;
}
如果(!isCancelled()){
状态=p.waitFor();
}
p、 getInputStream().close();
p、 getOutputStream().close();
p、 getErrorStream().close();
p、 破坏();
}捕获(IOException | InterruptedException ex){
例如printStackTrace(System.err);
}
返回状态;
}
@凌驾
受保护的无效进程(java.util.List消息){
System.out.println(“消息::”+消息);
statusLabel.setText((this.getState()).toString());
用于(字符串消息:消息){
textArea.append(消息+“\n”);
}
}
@凌驾
受保护的void done(){
statusLabel.setText((this.getState()).toString()+“”+status);
stopButton.setEnabled(错误);
startButton.setEnabled(真);
bar.setUndeterminate(假);
}
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新SwingWorkerExample().displayGUI();
}
});
}
}
问题由OP“通过删除如下启动”解决:


D:\\BackupScripter\u cmd\u stream.bat是否存在?在我的机器上它能工作是的。。。它是存在的。。输出System.out.println(“s::”+stdout.readLine())是什么;在我这边它是空的。。。批处理文件在我这方面也可以很好地工作,并且完成了它应该做的事情。。但是我在swing框架中看不到输出。你能发布这个
BackupScripter\u cmd\u stream.bat
文件的一些部分吗?通过删除start解决了这个问题,如下所示:String command=“cmd.exe,/C,D:\\BackupScripter\u cmd\u stream.bat”;ProcessBuilder pb=新的ProcessBuilder(命令);嗨,你能把你最后的密码作为答案吗?我不知道你说的“如下删除start”是什么意思,你是说你没有调用pb.start()?
String command = "cmd.exe , /C, D:\\BackupScripter_cmd_stream.bat";
ProcessBuilder pb = new ProcessBuilder(command);