【问题标题】:JavaFX trigger object creation at runtime from a distinct thread [closed]JavaFX在运行时从不同的线程触发对象创建[关闭]
【发布时间】:2018-08-26 13:44:54
【问题描述】:

我有两个线程,每个线程都有自己的功能:一个处理从套接字读取输入,另一个是与 GUI 相关的线程(使用 JavaFX)。

读取线程包含对创建 GUI 线程的 Runnable 对象的引用。当读取线程接收到某个类型的对象时,它会从 GUI 线程中调用一个方法。

此方法应创建一个新的 Button,该按钮标有通过套接字接收的一些文本。但是,然后尝试实例化一个新按钮,我得到以下异常:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4.

我提到当我尝试更新现有组件时,一切正常,并且不再抛出此异常,因此我得出结论,对象创建是触发异常的原因。

是否可以从不同的线程(如上所述)命令类的实例化?如果没有,是否有任何解决方法可以达到相同的结果?

谢谢!

【问题讨论】:

  • A) 关于如何提问的一般说明:每当您将问题描述为“当这样做时/当做其他事情时发生其他事情”时,您必须提供minimal reproducible example 证明了这种行为。 B)关于如何开始解决此类问题的一般说明:只需在您最喜欢的搜索引擎中输入错误消息;)然后,当建议的解决方案似乎都不适合您的特定环境时 - 选择最接近使用的解决方案注意 A ...

标签: java multithreading sockets javafx


【解决方案1】:

这可能已经被问了一千次,是 JavaFX 编程的一个基本方面。必须从应用程序线程向 GUI 添加(而不是创建)控件。因此,如果您想从其他线程启动它,您必须将您的调用包装到 Platform.runLater() 调用中。

【讨论】:

  • 谢谢,Platform.runLater() 满足我的需求。但是,与其说这个问题已经被问了一千次,您还可以提供一个指向其中一个帖子的 SO 链接。我决定只是在搜索了类似的问题并且没有找到任何有用的东西之后才在这里问......
  • 对不起,如果我的回答听起来有点粗鲁,但是在搜索功能中使用异常消息的相关部分真的很难吗?我得到了 38 个“IllegalStateException:不在 FX 应用程序线程上”的结果,其中第一个提到了 Platform.runLater()。
  • arrghh .. 这真的很糟糕:@Polb 你懒得用任何搜索引擎做最简单的搜索,但又想批评一个至少能把你推向正确方向的人?如果您确实尝试过但没有找到任何东西,您必须改进您的搜索策略.. 或者做一些除了软件之外的其他事情。
  • @kleopatra 请再次阅读我的回复。首先,我说“谢谢”,我赞成他的结果,所以其他人知道这是有帮助的,我没有批评任何人。我想强调这样一个事实,即 SO 使用户可以将问题表示为重复,并提供对已经有答案的重复项的引用。这比争论我的搜索引擎好不好要简单得多。还请注意,我坚持问题的主题,不像你,谁觉得质疑我的软件技能是合适的。这不是 SO 的工作方式。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2021-10-08
  • 2021-04-12
  • 1970-01-01
相关资源
最近更新 更多