更新:我发现了一个关键部分,解释了为什么这可能不起作用!我使用了这个系统。放样(out);其中out是到JTextArea的特殊打印流
这是代码,但我遇到的问题是,信息只有在我结束流程后才会打印出来。
public Constructor() {
main();
}
private void main() {
btnStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
ProcessBuilder builder = new ProcessBuilder("java", textFieldMemory.getText(), "-jar", myJar);
Process process = builder.start();
InputStream inputStream = process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream), 1);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
inputStream.close();
bufferedReader.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
});
}
电流输出:
Line 1
Line 2
Line 3
Line 4
Line 5
这是正确的输出,但是当我结束这个过程时,它只是作为一个大块打印。
有人知道问题是什么吗?如果是的话,你能帮我解释一下为什么会这样吗,提前谢谢你。
基本上,从仅有的少量信息来看,这听起来像是您在事件调度线程中执行流程并读取输入流。
任何阻止EDT的操作都会阻止它处理重绘请求,相反,您应该使用类似SwingWorker的工具,该工具具有允许您使用EDT更新UI的功能。
查看Swing中的并发以了解更多详细信息
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class PBDemo {
public static void main(String[] args) throws Exception {
new PBDemo();
}
public PBDemo() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
JTextArea ta = new JTextArea();
add(new JScrollPane(ta));
new ProcessWorker(ta).execute();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public interface Consumer {
public void consume(String value);
}
public class ProcessWorker extends SwingWorker<Integer, String> implements Consumer {
private JTextArea textArea;
public ProcessWorker(JTextArea textArea) {
this.textArea = textArea;
}
@Override
protected void process(List<String> chunks) {
for (String value : chunks) {
textArea.append(value);
}
}
@Override
protected Integer doInBackground() throws Exception {
// Forced delay to allow the screen to update
Thread.sleep(5000);
publish("Starting...\n");
int exitCode = 0;
ProcessBuilder pb = new ProcessBuilder("java.exe", "-jar", "HelloWorld.jar");
pb.directory(new File("C:\\DevWork\\personal\\java\\projects\\wip\\StackOverflow\\HelloWorld\\dist"));
pb.redirectError();
try {
Process pro = pb.start();
InputConsumer ic = new InputConsumer(pro.getInputStream(), this);
System.out.println("...Waiting");
exitCode = pro.waitFor();
ic.join();
System.out.println("Process exited with " + exitCode + "\n");
} catch (Exception e) {
System.out.println("sorry" + e);
}
publish("Process exited with " + exitCode);
return exitCode;
}
@Override
public void consume(String value) {
publish(value);
}
}
public static class InputConsumer extends Thread {
private InputStream is;
private Consumer consumer;
public InputConsumer(InputStream is, Consumer consumer) {
this.is = is;
this.consumer = consumer;
start();
}
@Override
public void run() {
try {
int in = -1;
while ((in = is.read()) != -1) {
// System.out.print((char) in);
consumer.consume(Character.toString((char)in));
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
}
}
在单独的线程中处理进程的输出流可能会有所帮助。您还需要显式等待进程结束,然后再继续您的逻辑:
ProcessBuilder builder = new ProcessBuilder("java",
textFieldMemory.getText(), "-jar", myJar);
final Process process = builder.start();
final Thread ioThread = new Thread() {
@Override
public void run() {
try {
final BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
};
ioThread.start();
process.waitFor();
问题内容: 我有一个HTML报告,由于列很多,因此需要横向打印。是否有一种方法可以执行此操作,而无需用户更改文档设置? 在浏览器中有哪些选项。 问题答案: 在CSS中,您可以设置@page属性,如下所示。 @page是CSS 2.1规范的一部分,但是问题的答案并未突出显示[@Page{size:landscape}是否已过时?: CSS 2.1不再指定size属性。CSS3 Paged Media
用gdb调试程序时,如果想查看进程的内存映射信息,可以使用“i proc mappings”命令(i是info命令缩写),例如: (gdb) i proc mappings process 27676 flags: PR_STOPPED Process (LWP) is stopped PR_ISTOP Stopped on an event of interest PR_RLC Run-on-l
问题内容: 这是此问题的后续措施,但是如果我想将参数传递给,如何实时获取输出?这就是我目前拥有的;我也尝试从模块中替换为,这只会导致脚本挂起。 在我不必通过的前一个问题中,建议我使用,没有空间输送任何东西到。 附录:这适用于传输,但是我只能在最后看到输出,并且我想查看传输发生时的详细信息。 问题答案: 为了实时从子流程中获取标准输出,您需要准确确定所需的行为;具体来说,您需要确定是要逐行处理还是逐
a.c: #include <stdio.h> int func(int a, int b) { int c = a * b; printf("c is %d\n", c); } int main(void) { func(1, 2); return 0; } b.c: #include <stdio.h> int func1
问题内容: 我对熊猫和matplotlib还不熟悉。无法获取对 绘制模式如下的“DataFrame” 喜欢画三维图形w.r.t.x,y和z 这是我使用的示例代码 I am getting a empty graph plot. definitely missing something. Any pointers? -Thx Request-1: Print df Result of top 10
我们希望打印到连接在apache运行的POS打印机上。由于应用程序的设计和部署,打印应该从服务器上完成(它应该检测订单并发送到不同的打印机和不同格式的打印...账单,厨房订单,等等...)。出于这个原因和其他原因(例如,从iPad访问应用程序),我们放弃了像QZ-Print applet这样的选项,并需要直接在服务器端打印。 提前谢了。