我正在为一些生物过程建立一个模拟器。我使用了一个包含大量元素的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);
}发布于 2013-08-26 22:11:08
假设您每次都在displaySummaryOfArraylistInJTableForThisIteration(s);中设置新的表模型,您仍然需要为此进程使用线程,以便每次在表中设置信息时都可以显示信息,而不是在进程结束时显示信息,请在swing中选中concurrency
所以你要找的东西是这样的
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发送到构造函数。最后,只需使用Thread类中的start();方法。要进行概念性解释,您可以访问this。
发布于 2013-08-26 22:23:01
如果你在Event Dispatch Thread中运行,那么图形用户界面将会冻结,直到完成。你可以在这里使用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);
}
}https://stackoverflow.com/questions/18446112
复制相似问题