java从同一个UI启动多个swingworkers

时间:2010-10-20 00:42:33

标签: java user-interface swing swingworker continuous

用户界面和设置的简要说明

1)普通香草框架, button1 button2 textarea1 textarea2

2) Button1 使用swingworker myswingworker1 启动连续运行任务,并且swingworker的处理方法不断更新textarea1

3) Button2 使用swingworker myswingworker2 启动连续运行任务,并且swingworker的处理方法不断更新textarea2

在这种情况下,持续运行的任务是“adb logcat”,这个命令不断将连续的日志信息写入outstream,我捕获并打印到textarea。这种捕获和打印是在swingworker内完成的。

问题

只有一个按钮似乎可以执行将输出一次打印到textarea的预期任务,按钮1或按钮2,无论哪个先启动。用户界面永远不会冻结。

作为实验的一部分,我用一个命令“dir”替换了一个长时间运行的任务,该命令运行并立即返回,即我将“dir”附加到button2。现在,如果我运行 button2 ,它可以工作,然后 button1 它也可以运行。如果我反过来只运行由 button1 启动的长时间运行的任务,那么由 button2 启动的任务似乎等待长时间运行的任务结束,这会使使用摇摆工的全部目的。

如何解决这个问题?如何阻止我的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 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");
}

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 {

1 个答案:

答案 0 :(得分:1)