【发布时间】:2013-04-24 20:11:31
【问题描述】:
在 JDialog 中,当用户单击 JButton 时,我想在 EDT 中执行 2 个 GUI 操作:
- 显示另一个带有忙碌图标的小 JDialog,告诉用户“错误的进程结束,请稍候”。
- 在 JTable 中插入大量记录。
当我尝试执行这两个操作时,“请稍候”对话框会按预期阻止插入过程。
正如您所见,这两项操作都必须在 EDT 中完成......所以有解决方案吗?
【问题讨论】:
在 JDialog 中,当用户单击 JButton 时,我想在 EDT 中执行 2 个 GUI 操作:
当我尝试执行这两个操作时,“请稍候”对话框会按预期阻止插入过程。
正如您所见,这两项操作都必须在 EDT 中完成......所以有解决方案吗?
【问题讨论】:
不,这两个动作都不应该在 EDT 中执行。
您的记录不应插入 JTable 中,而应插入其 TableModel 中,从而触发更新事件。这样,您可以在显示对话框时轻松更新表格。
一旦表格模型被更新,触发一个事件以确保表格被重新绘制,并且它将起作用。
【讨论】:
第二件事不需要在 EDT 中完成。生成一个线程以将项目添加到 JTable 的模型中,但让该线程偶尔使用 SwingWorker.invokeLater() 来触发“fireTableDataChanged”事件。
【讨论】:
SwingUtilities.invokeLater(),EventQueue.invokeLater() 的封面,在这里和以后的 cmets?
大多数 TableModel,例如 DefaultTableModel,在模型更新后立即调用 fireXXX 方法,所以是的,您希望在 EDT 上完成模型更新,以便正确重绘表格。
"进程错误请稍候 结束”。
然后您可以根据需要更新模型而无需锁定。
【讨论】:
DefaultTableModel 的行为是正确的,但你对TableModel 的实际实现是正确的,包括AbstractTableModel 的具体子类。