【问题标题】:Is there a way to make an ActionListener execute code as it reads it?有没有办法让 ActionListener 在读取代码时执行代码?
【发布时间】:2016-02-13 18:26:21
【问题描述】:

我注意到,每当调用ActionListener 方法时,它似乎会累积结果,然后在方法完成后,它会立即显示所有结果。例如,在我的程序中,我有几个wait(int milliseconds) 方法调用。使用此代码,每当我按下一个按钮时,都会有一个长时间的停顿,它似乎被冻结了,但它会立即显示所有内容。有没有办法让它在读取代码时执行代码?

【问题讨论】:

  • 您希望我们在没有看到您的任何代码的情况下说什么?您需要发布一个MCVE(一个M初始、C完整和V可验证E示例)至少。
  • 看看 SwingWorker 或 Swing Timer 看看它们是否满足您的要求
  • @MadProgrammer 我在文档上找到了 SwingWorker,但我找不到 Swing Timer... 你能给我一个链接吗?谢谢!
  • 核心库中至少有 3 个 Timer 类,您要查找的是 javax.swing.Timer(又名 Swing Timer)。也看看How to use Swing Timers
  • @MadProgrammer 效果很好!谢谢你的帮助!现在我如何将此问题标记为已回答,因为您的回答是评论而不是技术上的问题?

标签: java time actionlistener


【解决方案1】:

使用swingworker类,该类使用doInBackground方法作为后台进程,同时您可以调用其发布方法与进程一起使用后台处理显示结果见 https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html#publish-V...-

【讨论】:

    【解决方案2】:

    根据您想要实现的目标,您可以使用 SwingWorker 或 Swing Timer

    查看Worker Threads and SwingWorkerHow to use Swing Timers 了解更多详情

    worker 允许您在后台(脱离 EDT)运行长时间运行或阻塞的进程,但提供重新同步 UI 更新的方法。计时器将在 EDT 的上下文中调用已注册的ActionListener,允许您在指定延迟后(并且可能重复)从其中安全地更新 UI

    【讨论】:

      【解决方案3】:

      您不应在 Gui 线程上的任何侦听器中调用 wait。改用定时回调,例如在这里使用我的GuiTimer 类:Call function every x time without blocking the GUI Java

      【讨论】:

      • 老实说,一个 SwingWorker 会更简单、更容易使用并达到相同的基本结果。 Swing Timer 也可以做同样的工作
      • @MadProgrammer 我觉得在任何时间使用Thread.sleep 都不是一个好主意。无论 SwingWorkers 是创建一个新线程还是从线程池中取一个,它都会导致该线程在一段时间内什么都不做,同时持有资源(线程 ID、堆栈的内存等......)或者我错过了什么?
      • 这取决于OP的要求。就个人而言,如果他们需要定期调用一个方法,一个 Swing Timer 就可以了,如果他们需要执行长时间运行的操作,一个 SwingWorker 会更好。至于Thread.sleep 的使用,我唯一的规则是,不要在 EDT 的上下文中使用。用户可能不会注意到启动/启动线程所需的时间,冻结的 UI 是
      • 您还必须意识到,几乎所有计时器都将依赖 Thread.sleep,因为没有(Java)计时器保证准确的时间,它们只保证“至少”计时;)
      • 但是你指出的这些漂亮的摇摆定时器使用单个线程来按照文档进行所有定时,无论你实例化多少个定时器,就像一个单线程的 ScheduledThreadPoolExecutor,(我非常喜欢很多)。这比每秒钟启动一个新线程要好,不是吗。但是正确,这些必须在内部使用 Thread.sleep (除非这里使用了一些花哨的操作系统特定的低级定时回调,我对此表示怀疑)
      猜你喜欢
      • 2017-10-20
      • 2012-10-24
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多