有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

只有在程序用java完成执行后才能看到swing输出

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

  1. # 1 楼答案

    假设您每次都在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

  2. # 2 楼答案

    如果在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);
        }
    }