Java 从jTextArea上的shell命令获取结果
我必须从java swing应用程序执行shell命令windows并获得实时结果:Java 从jTextArea上的shell命令获取结果,java,swing,shell,cmd,jtextarea,Java,Swing,Shell,Cmd,Jtextarea,我必须从java swing应用程序执行shell命令windows并获得实时结果: String cmd = jTextField1.getText(); StringBuffer output = new StringBuffer(); Process p; try { p = Runtime.getRuntime().exec(cmd); BufferedReader reader = new BufferedReader(new InputStreamReader(
String cmd = jTextField1.getText();
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println("" + line);
jTextArea1.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
问题是jTextArea中的写入是在执行完成之后,不像System.out.println那样是实时的 尝试创建一个线程,并使用Thread.sleep对JTextArea进行实时更新 创建一个子类,如下所示
class Work implements Runnable {
String cmd;
Work(String c) {
this.cmd = c;
}
@Override
public void run() {
Process p;
try {
p = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println("" + line);
Thread.sleep(500);
jTextArea1.append(line + "\n");
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
String cmd = jTextField1.getText();
StringBuffer output = new StringBuffer();
new Thread(new Work(cmd)).start()
更改代码如下
class Work implements Runnable {
String cmd;
Work(String c) {
this.cmd = c;
}
@Override
public void run() {
Process p;
try {
p = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println("" + line);
Thread.sleep(500);
jTextArea1.append(line + "\n");
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
String cmd = jTextField1.getText();
StringBuffer output = new StringBuffer();
new Thread(new Work(cmd)).start()
尝试创建一个线程并使用Thread.sleep对JTextArea进行实时更新 创建一个子类,如下所示
class Work implements Runnable {
String cmd;
Work(String c) {
this.cmd = c;
}
@Override
public void run() {
Process p;
try {
p = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println("" + line);
Thread.sleep(500);
jTextArea1.append(line + "\n");
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
String cmd = jTextField1.getText();
StringBuffer output = new StringBuffer();
new Thread(new Work(cmd)).start()
更改代码如下
class Work implements Runnable {
String cmd;
Work(String c) {
this.cmd = c;
}
@Override
public void run() {
Process p;
try {
p = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println("" + line);
Thread.sleep(500);
jTextArea1.append(line + "\n");
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
String cmd = jTextField1.getText();
StringBuffer output = new StringBuffer();
new Thread(new Work(cmd)).start()
从事件分派线程EDT外部更新swing组件时,应使用SwingWorker或调用SwingUtilities.invokeLater,如下所示:
while ((line = reader.readLine()) != null) {
final String appendLine = line + "\n";
System.out.println("" + line);
SwingUtilities.invokeLater(new Runnable(){
public void run(){
jTextArea1.append(appendLine);
}
});
}
从事件分派线程EDT外部更新swing组件时,应使用SwingWorker或调用SwingUtilities.invokeLater,如下所示:
while ((line = reader.readLine()) != null) {
final String appendLine = line + "\n";
System.out.println("" + line);
SwingUtilities.invokeLater(new Runnable(){
public void run(){
jTextArea1.append(appendLine);
}
});
}
这是不正确的同步;显示了更好的方法。这是错误同步的;显示了一种更好的方法。