【问题标题】:Can i run 2 GUI actions in the EDT?我可以在 EDT 中运行 2 个 GUI 操作吗?
【发布时间】:2013-04-24 20:11:31
【问题描述】:

在 JDialog 中,当用户单击 JButton 时,我想在 EDT 中执行 2 个 GUI 操作:

  1. 显示另一个带有忙碌图标的小 JDialog,告诉用户“错误的进程结束,请稍候”。
  2. 在 JTable 中插入大量记录。

当我尝试执行这两个操作时,“请稍候”对话框会按预期阻止插入过程。

正如您所见,这两项操作都必须在 EDT 中完成......所以有解决方案吗?

【问题讨论】:

    标签: java swing edt


    【解决方案1】:

    不,这两个动作都不应该在 EDT 中执行。

    您的记录不应插入 JTable 中,而应插入其 TableModel 中,从而触发更新事件。这样,您可以在显示对话框时轻松更新表格。

    一旦表格模型被更新,触发一个事件以确保表格被重新绘制,并且它将起作用。

    【讨论】:

    • 谢谢 Riduidel ... Paul,我不知道谁先回答了这个问题,所以感谢您的评论 :)
    【解决方案2】:

    第二件事不需要在 EDT 中完成。生成一个线程以将项目添加到 JTable 的模型中,但让该线程偶尔使用 SwingWorker.invokeLater() 来触发“fireTableDataChanged”事件。

    【讨论】:

    • 你的意思是SwingUtilities.invokeLater()EventQueue.invokeLater() 的封面,在这里和以后的 cmets?
    • 就是这个。当你完成了和我一样多的编程语言和 API 时,所有的名字都会相互碰撞。
    【解决方案3】:

    大多数 TableModel,例如 DefaultTableModel,在模型更新后立即调用 fireXXX 方法,所以是的,您希望在 EDT 上完成模型更新,以便正确重绘表格。

    "进程错误请稍候 结束”。

    使用indeterminate JProgressBar

    然后您可以根据需要更新模型而无需锁定。

    【讨论】:

    • 这是不正确的。标准做法是在非 EDT 线程中更新表模型,然后使用 SwingWorker.invokeLater 在 EDT 中调用“fireTableDataChanged”。
    • @Paul Tomblin:我认为@camickr 关于DefaultTableModel 的行为是正确的,但你对TableModel 的实际实现是正确的,包括AbstractTableModel 的具体子类。
    • @Paul Tomblin,据我了解 MVC,当模型中的数据发生变化时,模型有责任通知视图。我相信 JDK 中的所有“默认模型”(即 JTable、JTree、JList 的模型......)都会调用相关抽象模型中已实现的 fireXXX 方法。如果您创建自定义模型,那么您可以在模型更改时不通知视图,但我相信这会破坏 MVC。
    • 再次向我解释为什么使用 SwingWorker.invokeLater 在 EDT 中调用 fireTableDataChanged 会破坏 MVC?
    • 因为模型没有通知视图。您的方法是 1)更新模型,然后 2)通知视图。因此,如果程序员忘记了这两个步骤,视图将不会改变。我对MVC的理解是Model应该直接通知View。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2021-09-07
    • 2018-07-24
    • 1970-01-01
    • 2018-11-07
    • 2017-05-04
    相关资源
    最近更新 更多