2

我正在为一些生物过程构建一个模拟器。我使用了一个包含大量元素的 ArrayList。我在循环中调用了一些 3-4 个函数(返回结果需要相当长的时间)来操作和操作这个 ArrayList。在每个循环结束时,我在 jTable 中显示了此迭代的结果。我面临的问题是,在每个循环结束时,我应该看到添加了一行,但只有在程序完成执行后我才能看到整个输出(即 Whole )。

以下代码有助于可视化我的代码架构

ArrayList<String> s = new ArrayList<String>();
for(int i=1;i<=1000;i++){
process1(s);
process2(s);
.
.
.
processn(s);
displaySummaryOfArraylistInJTableForThisIteration(s);
}
4

2 回答 2

1

如果你在Event Dispatch Thread中运行,那么 gui 将冻结直到完成。你可以在这里使用SwingWorker这是一个我非常喜欢Swing Worker 的例子

例子:

class Worker extends SwingWorker<Void, String> {

    @Override
    protected void doInBackground() throws Exception {
       //here you make process the mail
       String partialResults= process1();
       publish(partialResults);
       String partialResults= process2();
       publish(partialResults);
       .
       .


    }

    @Override
    protected void process(List<String> chunks) {
        //this is executed in the EDT
        addToJTable(chunks);
    }
}
于 2013-08-26T14:23:01.140 回答
1

假设您每次都在设置新的表模型,displaySummaryOfArraylistInJTableForThisIteration(s);您仍然必须为此进程使用线程,以便每次在表中设置信息时都可以显示信息,而不是在进程结束时,请在 swing中检查并发

所以你正在寻找这样的东西

private class YourTask implements Runnable {

    @Override
    public void run() {
       // refresh the table data

    }
}

 YourTask task = new YourTask();
        Thread newThread = new Thread(task);
        newThread.start();

首先,您需要定义一个实现的类,Runnable并且您将覆盖 run 方法,以便此方法可以执行您想要的行为,我建议您将您的类声明为内部类,以便您可以利用类全局字段。之后,您将创建一个实例YourClass和另一个实例,Thread将实例从发送YourClass到构造函数。最后只使用类中的start();方法Thread。要进行概念解释,您可以访问

于 2013-08-26T14:11:07.927 回答