2013-12-14 25 views
2

我试图使“实时感觉JTable”。我用JTable制作了GUI,然后有一个名为的按钮START。当我点击这个按钮时,程序会在start()方法下面调用。 (这只是一个例子)。添加行是没有问题的,它运行良好。但问题是,一次只能在处进入Jtable。(也许程序完成开始()方法,行一起出现在一起)。我的start()方法中有1000多个语句。这不是实时的感觉。我应该等到开始方法结束。然后1000行添加立即用“实时感觉”将行添加到JTable中

void start(){  
    int a = 3+3; 
    addRow(new String[]{"a is 6"}) 
    int b = 4+4; 
    addRow(new String[]{"b is 8 "}) 
} 

我会做的是只是“实时感觉”,我希望看到一个添加一行一个,不是一次。你能理解我的目的吗?想象一下“小提琴手”节目。你可以轻松理解。谁能帮我?我应该做一个线程?

感谢您的阅读,并为ackward表达遗憾(英语不是我的语言)

回答

1

这是因为Swing线程工作的方式。有一个线程可以处理所有的渲染,更新等。你对start()方法的处理发生在渲染线程中,因此在你从方法返回之前,GUI上的其他任何东西都不会响应。

您需要做的是使用SwingWorkerThreadPoolExecutor并将处理关闭到另一个线程。随着处理过程的继续,可以定期更新GUI。

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

需要注意的是做这个的人可以潜在地按一下按钮多次,再次调用start()第一个完成之前。您需要考虑并处理该情况 - 例如,通过禁用按钮直到第一个完成。

1

使用基于Swing的Timer。在actionPerformed(..)添加新记录。详细信息请参见How to Use Swing Timers

1

在swing中有一个称为EDT(Event Dispatcher Thread)的线程,它负责GUI表现为像实时用户friednly应用程序一样的行为。如果您使用长时间运行的方法来干扰EDT,则会冻结您的应用程序GUI。您必须在后台执行长时间运行的任务(与EDT不同的线程)。您可以使用javax.swing.SwingWorker<T,V>javax.swing.Timer