【发布时间】:2010-10-20 00:42:33
【问题描述】:
用户界面和设置的简要说明
1) 普通的原版框架,带有 button1 和 button2 以及 textarea1 和 textarea2
2)Button1 使用 swingworker myswingworker1 启动一个持续运行的任务,并且 swingworker 的 process 方法不断更新 textarea1
3)Button2 使用 swingworkermyswingworker2 启动一个持续运行的任务,并且 swingworker 的 process 方法不断更新 textarea2
在这种情况下,持续运行的任务是“adb logcat”,该命令不断将持续的日志信息写入外流,我将其捕获并打印到 textarea。这种捕获和打印是在 swingworker 内部完成的。
问题
似乎只有一个按钮完成了一次将输出打印到文本区域的预期任务,按钮 1 或按钮 2,以先启动者为准。用户界面永远不会冻结。
作为实验的一部分,我用命令“dir”替换了一个长时间运行的任务,该命令立即运行并返回,即我将“dir”附加到 button2。现在,如果我运行 button2,它可以工作,然后 button1 它也可以工作。如果我反过来只运行由 button1 启动的长时间运行的任务,而由 button2 启动的任务似乎在等待长时间运行的任务结束,这会破坏使用 swingworker 的全部目的。
如何解决这个问题?如何防止我的 UI 等待一个 swingworker 完成?
代码摘录
public class multiswing extends javax.swing.JFrame {
public multiswing() {
initComponents();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
myswingworker1 m1=new myswingworker1(jTextArea1);
m1.execute();
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
myswingworker2 m2=new myswingworker2(jTextArea2);
m2.execute();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new multiswing().setVisible(true);
}
});
}
public class myswingworker1 extends SwingWorker {
JTextArea jTextArea = new JTextArea();
Process proc;
Runtime rt = Runtime.getRuntime();
public myswingworker1(JTextArea jTextArea) {
this.jTextArea = jTextArea;
}
protected Void doInBackground() throws Exception {
String line = null;
rt = Runtime.getRuntime();
proc = rt.exec("adb logcat");
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
publish(line);
}
return null;
}
@Override
protected void process(List<String> chunks) {
String data = chunks.get(0);
jTextArea.append(data + "\n");
}
}
public class myswingworker2 extends SwingWorker {
JTextArea jTextArea = new JTextArea();
Process proc;
Runtime rt = Runtime.getRuntime();
public myswingworker2(JTextArea jTextArea) {
this.jTextArea = jTextArea;
}
@Override
protected Void doInBackground() throws Exception {
String line = null;
rt = Runtime.getRuntime();
proc = rt.exec("dir");
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
publish(line);
}
return null;
}
@Override
protected void process(List<String> chunks) {
String data = chunks.get(0);
jTextArea.append(data + "\n");
}
}
【问题讨论】:
标签: java user-interface swing swingworker continuous