我可以在 EDT 中运行 2 个 GUI 操作吗?
在 JDialog 中,当用户单击 JButton 时,我想在 EDT 中执行 2 个 GUI 操作:
- 显示另一个带有忙碌图标的小 JDialog,以告诉用户“请等待错误的进程结束”。
- 在 JTable 中插入大量记录。
当我尝试执行这两个操作时,“请等待”对话框会按预期阻止插入过程。
正如您所看到的,这两个操作都必须在 EDT 中完成...那么有解决方案吗?
In a JDialog, when user clicks a JButton i want to execute 2 GUI actions in the EDT :
- Showing another small JDialog with a busy icon in it to tell the user "Please wait while the wrong process ends".
- Inserting a big number of records in a JTable.
When i try to execute both actions the "please wait" dialog blocks the inserting process, as expected.
As you see both actions must be done in EDT ... so is there a solution for this ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不,这两个操作不应在 EDT 中执行。
您的记录不应插入到 JTable 中,而应插入到其 TableModel 中,从而触发更新事件。这样,您可以在显示对话框时轻松更新表格。
一旦表模型更新,触发一个事件以确保表被重新绘制,并且它将起作用。
No, both actions should not be executed in the EDT.
Your records should not be inserted in the JTable, but rather in its TableModel, triggering update events. This way, you can easily have the table updated while your dialog is shown.
Once the table model is updated, fire an event to ensure table is repainted, and it will work.
第二件事不需要在 EDT 中完成。生成一个线程以将项目添加到 JTable 的模型中,但让该线程偶尔使用 SwingWorker.invokeLater() 来触发“fireTableDataChanged”事件。
The second thing does not need to be done in the EDT. Spawn off a thread to add the items to the JTable's model, but have that thread occasionally use SwingWorker.invokeLater() to fire off "fireTableDataChanged" events.
大多数 TableModel(例如 DefaultTableModel)会在模型更新后立即调用 fireXXX 方法,因此您希望在 EDT 上完成模型更新,以便正确重新绘制表。
使用 不确定的 JProgressBar
那么你可以根据需要更新模型而不锁定。
Most TableModels, for example the DefaultTableModel, invoke the fireXXX methods as soon as the model is updated so yes you want the updating of the model to be done on the EDT so the table gets repainted properly.
Use an indeterminate JProgressBar
then you can update the model as required without it locking.