2010-10-20 34 views
1

UI和设置的java从相同的用户界面启动多个swingworkers

1)纯香草框架的简要描述,以button1的BUTTON2textarea1textarea2

2 )Button1的启动使用的SwingWorker myswingworker1和SW连续运行的任务ingworker的工艺方法不断更新textarea1

3)Button2的使用的SwingWorker启动一个连续运行的任务myswingworker2和SwingWorker类的工艺方法不断更新textarea2

在这种情况下,持续运行的任务“亚行logcat” ,这个命令不断写出连续的日志信息到外面,我捕获并打印到textarea。这种捕获和打印是在回转工人内完成的。

问题

只有一个一键似乎做一次打印输出到textarea的预期任务,无论是按钮1或按钮2,取第一次启动。用户界面永远不会冻结。

随着实验的一部分,我更换了一个长期运行的任务与说指令“dir”它运行并立即返回,即我所附的“目录”,以BUTTON2。现在,如果我跑BUTTON2,它的工作原理,然后Button1的它也能工作。如果我做的其他方式轮只Button1的运行开始长期运行的任务和BUTTON2启动任务似乎等待长期运行的任务结束了,这违背了使用的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"); 
} 

}

回答