【发布时间】:2015-06-12 07:43:50
【问题描述】:
我在 jFrame 中有一个 jLabel,它必须从 shell 脚本的输出中更新其内容。 shell 脚本的执行是由另一个 jFrame 中的线程完成的,我将输出存储在 StringBuilder(公共和静态)中:
p = Runtime.getRuntime().exec("testpad -i -c"+can+" -n"+pad+" "+pathFile);
final InputStream inStream = p.getInputStream();
Thread uiThread = new Thread("UIHandler") {
@Override
public void run() {
InputStreamReader reader = new InputStreamReader(inStream);
Scanner scan = new Scanner(reader);
prec=null;
while (scan.hasNextLine()) {
prec=scan.nextLine();
System.out.println(prec);
sbuff.append(prec);
sbuff.append('\n');
}
}
};
uiThread.start();
当显示 jPannel 时,我会更新 jLabel(jPannel 中的内容):
private void jPanel1ComponentShown(java.awt.event.ComponentEvent evt) {
// TODO add your handling code here:
jLabel2.setText(inizio.sbuff.toString());
}
我认为这是一个竞争条件问题,但我放了一个 Thread.sleep() 有很多秒,但 jLabel 的内容没有更新。 我这样做的例子:
当我按下 jButton 时,shell 脚本会在矩形中以红色打印输出,然后它会打开一个带有 jLabel 的新 jFrame,它应该更新但它不会改变。我哪里错了?谢谢。
【问题讨论】:
-
考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
-
我也会考虑使用
ProcessBuilder和SwingWorker而不是Runtime.exec和Thread -
我放了一个执行的例子。感谢您的点击。
标签: java multithreading swing shell