我正在尝试制作“实时感觉JTable”。我使用JTable创建了GUI,然后有一个名为 START 的按钮。当我单击此按钮时,程序将调用start()方法。 (这只是一个例子)。添加行没问题,效果很好。但问题是,行只是在一次来到Jtable。(也许是程序完成start()方法,这些行一起出现。)我的start()中还有1000多个语句方法。这不是实时的感觉。我要等到开始方法完成。然后1000行添加一次。
void start(){
int a = 3+3;
addRow(new String[]{"a is 6"})
int b = 4+4;
addRow(new String[]{"b is 8 "})
}
我要做的只是“实时感觉”,我希望看到逐行添加行 。你能理解我的目的吗?想象一下“小提琴手”节目。你很容易理解。谁能帮我?我应该制作一个帖子吗?
感谢您的阅读,并抱歉尴尬的表达(英语不是我的语言)
答案 0 :(得分:1)
使用基于Swing的Timer
。在actionPerformed(..)
中添加新记录。有关详细信息,请参阅How to Use Swing Timers。
答案 1 :(得分:1)
这是因为Swing线程的工作方式。有一个单独的线程可以处理所有的渲染,更新等。你对start()方法的处理发生在该渲染线程中,因此在你从方法返回之前,GUI上的其他内容都不会响应。
您需要做的是使用SwingWorker
或ThreadPoolExecutor
并将处理权限移植到另一个线程。然后,随着处理的继续,这可以定期更新GUI。
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
请注意,通过执行此操作,人们可能会多次单击该按钮,并在第一个完成之前再次调用start()
。您将需要考虑并处理该情况 - 例如,通过禁用按钮直到第一个按钮完成。
答案 2 :(得分:1)
在摇摆中有一个名为EDT(事件调度程序线程)的线程,它负责GUI的行为就像一个实时的用户端口应用程序。如果您使用长时间运行的方法干扰EDT,您将冻结应用程序GUI。您必须在后台执行长时间运行的任务(在与EDT不同的线程中)。您可以使用javax.swing.SwingWorker<T,V>
或javax.swing.Timer