使用SwingWorker获取jtable的实时结果



im string使用swing worker实时更新jTable行。。我为此写了一些代码片段。下面给出。我的问题是jTable只更新一行。当im调试时,它会检索一行、两行,有时甚至所有行。但当我运行代码样本时,它只检索一行。有人能帮我做这件事吗?

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方法被称为

最新更新