我正在为一些生物过程建立一个模拟器。我使用了一个包含大量元素的ArrayList。我在循环中调用了3-4个函数(这需要相当长的时间来返回结果),这些函数操作和操作这个ArrayList。在每个循环结束时,我在jTable中显示了此迭代的结果。我面临的问题是,在每个循环结束时,我应该看到一行添加但我只在程序完成执行后才看到整个输出(即整个)。
以下代码有助于可视化我的代码架构
ArrayList<String> s = new ArrayList<String>();
for(int i=1;i<=1000;i++){
process1(s);
process2(s);
.
.
.
processn(s);
displaySummaryOfArraylistInJTableForThisIteration(s);
}
答案 0 :(得分:1)
假设您每次都在displaySummaryOfArraylistInJTableForThisIteration(s);
设置新的表模型,您仍然必须使用线程进行此过程,因此每次在表中设置信息时都可以显示信息,而不是最后对于该过程,请查看concurrency in 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
方法。要进行概念性说明,您可以访问this。
答案 1 :(得分:1)
如果你在Event Dispatch Thread跑步,那么gui会冻结直到完成。 您可以使用SwingWorker这是一个我非常喜欢Swing Worker Example
的示例示例:
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);
}
}