java - 使用 SwingWorker 获取 jtable 的实时结果

标签 java multithreading swing

我尝试使用 Swing Worker 实时更新 jTable 行。我为此编写了一些代码片段。下面给出。我的问题是 jTable 仅更新一行。当我调试时,它会检索一行、两行或有时所有行。但是当我运行代码示例时,它会检索一行。任何人都可以帮助我解决这件事吗?

final DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
    removeAllRows(dtm);

    SwingWorker<Void, Object[]> sw = new SwingWorker<Void, Object[]>() {

        @Override
        protected Void doInBackground() throws Exception {
            Object[] array = null;
            for (Map.Entry<String, ArrayList<LinkTester.Result>> entrySet : hashMap.entrySet()) {
                boolean foo = true;
                String url = entrySet.getKey();
                ArrayList<LinkTester.Result> results = entrySet.getValue();

                for (LinkTester.Result result : results) {
                    if (foo) {
                        foo = false;
                        publish(new Object[]{url, result.getTestlink(), result.getResponseCode(), result.getAnchortxt()});

                    } else {
                        publish(new Object[]{"", result.getTestlink(), result.getResponseCode(), result.getAnchortxt()});

                    }
                }

            }
            return null;
        }

        @Override
        protected void process(List<Object[]> chunks) {
            Object[] a = chunks.get(chunks.size() - 1);
            dtm.addRow(a);
        }

    };
    sw.execute();

最佳答案

当您调用publish时,这些值会被暂存,也就是说,它们不会立即传递给process,这是出于效率原因

相反,尝试使用...

for (Object[] row : chunks) { 
    dtm.addRow(row) 
} 

在您的process方法中,这样您就可以“处理”所有可用条目

现在,如果您希望表更新得“更快”,您可以在 doInBackground 方法中放置一个 Thread.sleep(1) ,该方法,一般来说,应该允许调用 process 方法

关于java - 使用 SwingWorker 获取 jtable 的实时结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34661981/

相关文章:

python - 从另一个线程调用一个函数?

C#:如何测试基本线程 worker 类

java - 处理 JPanel 中生成的形状

java - Java中如何存储不同行数的数据?

java - BufferedReader:确定读取行的字节偏移量

c++ - 这个单例实现是线程安全的吗?

java - 在 JAVA 中将图像添加到 GUI 的问题

java - 填充 JTree

java - 启动sqldeveloper.exe

java - 通过同一类的另一个方法中的 getter 方法使用私有(private)属性