java从同一个UI启动多个swingworker

标签 java user-interface swing swingworker continuous

这个问题不太可能对 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the help center .




9年前关闭。




UI 和设置的简要说明

1) 纯 Vanilla 框架,带有 button1 和 button2 以及 textarea1 和 textarea2

2)Button1使用swingworker myswingworker1启动一个持续运行的任务,swingworker的进程方法不断更新textarea1

3)Button2使用swingworker myswingworker2发起连续运行任务,swingworker的进程方法不断更新textarea2

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

问题

似乎只有一个按钮可以完成一次将输出打印到 textarea 的预期任务,无论是 button1 还是 button2,以先启动的为准。用户界面永远不会卡住。

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

这个问题怎么解决?如何防止我的 UI 等待一名 Swing worker 完成?

代码摘录
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从同一个UI启动多个swingworker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3973964/

相关文章:

matlab - MATLAB GUI 中的全局变量?

java - 绘画程序界面的OO设计

Java Swing 对话框问题

java - 如何解决嵌套ArrayList的StackOverflowError?

java - PDF 的编码问题

java - 当我用 static 声明变量时,我得到了非法的表达式开始?

java - 解决 java.lang.StackOverflowError 内存问题

user-interface - Eclipse RCP : Display. getDefault().asyncExec 仍然阻塞我的 GUI

java - 在 JLabel HTML 中使用 BufferedImage?

java - 动态删除 Java Swing 容器(我的代码在按下按钮时挂起)