【问题标题】:JavaFX: Make LocalDateTime fire Event?JavaFX:使 LocalDateTime 触发事件?
【发布时间】:2019-09-10 14:09:13
【问题描述】:

我想自动化一个在线游戏。它在仅基于终端时起作用。但是我想添加一个 JavaFX UI,现在我不知道在哪里放置 Thread.waits 直到达到某个 LocalDateTime。 JavaFX 在哪里等待它的事件(如按钮单击,...),我可以覆盖该方法吗?或者有没有办法为 javaFX 创建自定义 LocalDateTime 事件和侦听器?

如果我在 initialize() 中添加 Thread.wait,则整个场景在达到某个 LocalDateTime 之前不会出现。

【问题讨论】:

  • 永远不要使用LocalDateTime 来跟踪片刻。阅读课堂文档。暂时使用InstantOffsetDateTimeZonedDateTime

标签: java events javafx action localdate


【解决方案1】:

如果您希望在某个预定时刻触发事件,但又希望应用的用户界面保持对用户操作的响应,那么您需要一个后台线程。您几乎不应该让您的应用程序的 GUI 线程休眠,因为这会使您的应用程序无响应并且似乎已崩溃。为了好玩,请以错误的方式尝试:Drop a Thread.sleep call 进入您的 GUI 代码,看看它是如何暂时冻结您的应用程序的。

了解concurrency。从Oracle Tutorial 开始,然后按自己的方式逐步完成圣经年度阅读,Java Concurrency in Practice Goetz 等。

Executors 框架旨在简化线程处理。具体来说,您将需要 ScheduledExecutorService 类。这已经在 Stack Overflow 上讨论过很多次了。搜索以了解更多信息。

并了解如何properly interact with the GUI thread from a background thread

切勿使用LocalDateTime 跟踪时刻,如课程文档中所述。暂时使用InstantOffsetDateTimeZonedDateTime。对于小时-分钟-秒级别的时间跨度,请使用DurationDuration 类提供了诸如toMinutestoSeconds 之类的方法,您可以将其结果作为your delay 提供给ScheduledExecutorService。 Stack Overflow 上已经多次介绍了所有这些类。搜索以了解更多信息。

【讨论】:

  • 您可能想要限定java.time.Duration,因为JavaFX 有自己的javafx.util.Duration 类,并且这个问题被标记为javafx——我已经看到相当多的问题让这两者混淆了。
  • 好吧,这比我想象的要复杂哈哈。我想我们将在本学期末学习多线程和并发。但是谢谢?
  • @DardanKryeziu 如果延迟动作不是太耗时(在 UI 线程上执行长时间运行的任务与阻塞它一样糟糕),那么您可以使用动画 API 来做您想做的事情。见stackoverflow.com/questions/9966136/…
  • @DardanKryeziu 是的,正确地进行并发是一个复杂的过程,即使是高级程序员也很难做到正确。但是 Executor 框架是一项出色的工作,可以极大地简化处理线程。您可以通过在 Stack Overflow 上搜索示例来获得更多帮助。我和其他人已经编写了完整的工作示例供您学习。如果共享任何资源或数据,您仍然需要关注 (a) 保护线程之间共享的资源或数据(在您的情况下为后台和 GUI),以及 (b) 不从后台线程访问 GUI 元素。
猜你喜欢
  • 1970-01-01
  • 2013-12-15
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 2019-06-18
  • 1970-01-01
相关资源
最近更新 更多