我已经浏览了SO和谷歌一段时间,想找到这个问题的答案,但我似乎找不到一个真正有效的答案。我将从头开始:
我用一个方法创建了一个Java类,该方法在后台运行一个批处理文件(命令窗口不会出现)。该程序运行得很好,只是最终用户会感到有点困惑,因为批处理文件需要一段时间才能完成——用户将不知道该程序是否仍在运行。批处理脚本完成执行后,会出现一个消息对话框,说明它已完成,但在方法运行和对话框出现之间的一段时间内,程序似乎什么也没做。
所以我的问题是:我非常想显示一个新的框架,其中有一个文本区域,显示批处理文件的输出。然而,我明白,如果不创建临时文件、向其写入数据、读取数据等,这是非常困难的。如果可能的话,我宁愿避免这种情况。因此,我决定最好在进程运行时显示一个不确定的JProgressBar,并在进程完成时关闭它。不幸的是,我认为Swing无法处理这个问题,因为它需要同时运行多个进程。我听说过一个SwingWorker,但不确定在这种情况下会如何使用它。我有以下SSCCE,它可以工作,但没有实现进度条。
public myClass(){
public static void main(String[] args){
String[] commands = {"cmd.exe", "/C", "C:\\users\\....\\myBat.bat"};
Process p = Runtime.getRuntime().exec(commands);
p.waitFor()
JOptionPane.showMessageDialog(null, "Process finished!");
}
}
当p.waitFor()等待进程时,屏幕上什么都没有。我只想向用户显示进程仍在运行。有什么想法吗?谢谢!
您可以在SwingWorker
的后台运行ProcessBuilder
,如下所示,以获得输出和进度条。
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.*;
/**
* @se http://stackoverflow.com/a/20603012/230513
* @see http://stackoverflow.com/a/17763395/230513
*/
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() {
statusLabel.setText((this.getState()).toString());
}
@Override
protected Integer doInBackground() {
try {
ProcessBuilder pb = new ProcessBuilder("ls", "-lR", "/");
pb.redirectErrorStream(true);
Process p = pb.start();
String s;
BufferedReader stdout = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = stdout.readLine()) != null && !isCancelled()) {
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) {
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();
}
});
}
}
问题内容: 我已经在SO和google上浏览了一段时间,以找到该问题的答案,但是我似乎找不到真正有效的方法。我将从头开始: 我用一个在后台运行批处理文件的方法创建了一个Java类(不显示命令窗口)。该程序运行良好,除了会使最终用户感到困惑之外,因为批处理文件需要一段时间才能完成-用户将不知道该程序是否仍在运行。批处理脚本执行完毕后,将显示一个消息对话框,说明已完成,但是在方法运行到对话框出现之间的
在为windows 7 64位运行jmeter(4.0版)批处理文件时,我发现以下错误:findstr未被识别为Internal或外部命令、可操作程序或批处理文件。找不到java可执行文件或版本我已将系统变量也设置为“C:\apache-jmeter-4.0\bin”,并检查是否安装了java版本和JDk(9.4版本)。
问题内容: 我正在尝试从Java可执行文件运行另一个目录中的批处理文件。我有以下代码: 结果是程序在运行该程序的根目录中打开一个cmd窗口,并且无法访问我提供的文件路径。 问题答案: 而不是,您需要使用方法签名: 但就我个人而言,我会改用,它稍微冗长一些,但比容易使用和调试。
我试图从我的Java可执行文件运行另一个目录中的批处理文件。我有以下代码: 结果是,程序在运行程序的根目录中打开了一个cmd窗口,无法访问我提供的文件路径。
我有一个包含4个命令的批处理脚本,如下所示 当我双击批处理文件时,它运行得很好。当我尝试从命令提示符运行批处理文件时,它没有看到要删除的. csv文件,我不确定这是为什么,但我认为这对我的目的并不重要。 当我从task scheduler手动运行任务时,它会截断数据库中的表并删除现有的csv文件,但没有创建新文件,这使我相信它会卡在.vbs文件上。 我试着用。vbs脚本,并将路径传递给。xls和。
我在画板上。cc和draw方法不会输出任何文本。 这个程序应该画三角形。我的画法会像它想象的那样画线,但是它不会画文本。让我沮丧的是,我以前用过文本(),没有问题。我回去用文本()加载了我以前做的另一个程序,它工作得很好!打印文本n一切。但我目前的程序不会这样做。 我很迷茫:(