只有在程序在java中执行完毕后才能看到输出

时间:2013-08-26 14:06:07

标签: java swing jtable

我正在为一些生物过程建立一个模拟器。我使用了一个包含大量元素的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);
}

2 个答案:

答案 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);
    }
}