Swing JTable更新

5
我正在进行一个Swings项目,其中在while循环中向JTable添加行。
我的情况是这样的:当用户单击按钮时,程序进入while()循环,并开始逐一向Jtable的DefaultTableModel添加行,直到while循环终止。但是问题是,只有在while循环结束后,表格才会更新数据。我希望在添加每一行后立即更新并在UI上显示它。
如果有人能够帮助我提供解决方案,那将非常好。
我已经尝试了在添加每一行后使用repaint(),但它没有起作用。

你的 while 循环需要多长时间? - Denis Tulskiy
3个回答

7
您需要在一个单独的线程中运行操作,然后在GUI线程中更新JTable。类似这样的代码:
public void someButtonClicked(params...) {
    new Thread(new Runnable() {
        public void run() {
            longOperation();
        }
    }).start();
}

public void longOperation() {
    for(int i=0; i<1000; i++) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // add new row to jtable
            }
        });
    }
}

2

0

如果你的整个while循环在Swing事件分派线程中响应按钮点击事件运行,直到你的事件处理代码完成(即actionPerformed方法的结尾),该线程将无法自由更新屏幕上的视图。

我不确定你想要实现什么 - 动画?你可以使用Swing的Timer类(javax.swing.Timer)以小延迟重复触发事件,并在每个事件的响应中向表格添加一行。只要你的事件处理代码在每个触发事件的响应中快速退出,Swing就应该能够在事件之间重新绘制视图。你真的需要相当了解Swing的线程模型,否则这些类型的问题会非常令人困惑。这并不太难 - 如果你搜索例如“Swing事件线程”,就会有很好的资源可供阅读。

关于调用repaint() - 这不起作用,因为repaint()和其他方法(如validate()等)只会标记组件需要重新绘制 - 直到Swing有机会执行此操作,组件才会实际上在屏幕上重新绘制,如果你在while循环中捕获Swing线程,它将无法自由进行绘制,直到你结束循环并完成事件处理代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接