【问题标题】:Add a row to a jTable each pass through a loop?每次通过循环向jTable添加一行?
【发布时间】:2010-02-26 19:47:14
【问题描述】:

我有一个 jTable 和一个 jButton。单击时,按钮的 actionPerformed 方法会调用另一个包含 while 循环的方法,并在每次循环时向表的模型 (DefaultTableModel) 添加一行。 while 循环可以运行几分钟,所以我希望它在 GUI 中显示每次添加到表中的行,逐一显示。但是现在它在循环完成后将所有行一起添加到表中,因此不是在几分钟的过程中一一增加行数,而是从几分钟显示一个有 0 行的表到然后立即拥有数千。我已经尝试在表格上调用 updateUI、repaint 等以及在模型上调用 fireTabledDataChanged 等,但这些都没有任何区别。我也尝试过使用 Swing Timer 但无济于事。感谢您提供任何帮助或指导,谢谢。

【问题讨论】:

    标签: java user-interface swing event-handling jtable


    【解决方案1】:

    阅读 Concurrency 上的 Swing 教程中的部分,其中更详细地解释了 EDT 的工作原理。除了创建自己的线程并使用 SwingUtilties.invokeLater() 之外,您还可以使用更新的方法使用 SwingWorker。本教程包含一个示例。

    我试过调用 updateUI,

    永远不要做那样的事情。即使它解决了你的问题,它也是错误的解决方案。您不是在更新 UI,而是在更新组件。

    【讨论】:

      【解决方案2】:

      如果您使用DefaultTableModel,则在每次迭代期间对您的模型调用addRow 应该会更新模型,然后再更新JTable。该表将请求重新绘制它,并且该请求将在 EDT 上进行。不幸的是,您长期运行的进程阻碍了其他请求在 EDT 上得到处理。你最好的办法是让你的按钮在工作线程中触发一个进程,然后该线程可以在Runnable 中执行其addRow 调用,该调用通过SwingUtilities.invokeLater 被放到EDT 上

      【讨论】:

      • 当我看到你发布你的答案时,我的答案应该几乎完全一样 :) - 所以我只是给你 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2021-07-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多