- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在建模一个将使用 JavaFX 的原型(prototype)。
该应用程序将与自助服务终端类似。然而,在客户端与其交互之前,管理员应该将其解锁。管理员将能够通过专用 channel (HTTP 或 IPC 或 USB 设备)发送一些远程命令。命令示例为:启动、停止和重置
我该怎么做?
a) 我可以有一个任务,在另一个线程池中主动运行 IPC,如果那里有消息,则切换场景?
b) 让 react 器在线程中运行,一旦收到命令,就会将其传递给 JavaFX 线程。
这两个选项都有效吗?是否存在第三个?
最佳答案
您的两个选项 (a) 都与 Task 相连(b) 没有任务的线程有效。
推荐解决方案
我会选择选项 b(没有任务的线程)。
解决方案的关键部分是以下行:
Platform.runLater(() -> MyApplication.changeScene(newData));
任务很好,但可能不是最适合您的情况
如果您有由 UI 或 JavaFX 线程启动的任务,那么任务就很好。例如,用户单击按钮,您希望根据该操作从服务器检索数据,通过消息反馈进度报告,并在检索数据时更新进度栏。因此,Task 非常适合此类操作,因为它对消息反馈和进度更新等内容有明确的支持,以及任务启动和完成时定义良好的状态模型。请参阅不变量代码示例以了解 Task 如何改进此类情况:Platform.runLater and Task in JavaFX .
但是,当事件的发起者脱离 JavaFX 应用程序线程时,与仅使用传统并发实用程序相比,使用任务并没有太大优势。这是因为您通常不需要任务提供的额外服务,例如进度和消息更新 API 及其状态机。此外,启动此类事件的库通常已经有自己的线程模型设置,因此您不需要任务提供的额外线程框架。
使用 Platform.runLater()
您真正想要的只是收到发生某事的通知。现在,通知需要在 JavaFX 应用程序线程上发生,因为您无法使用另一个线程操作 Activity 场景中的项目。要获取传递到 JavaFX 应用程序线程的事件,您可以使用 Platform.runLater(runnable)构造。
示例代码
我不会编写 Ruby,因为我真的不会,但这里有一些 Java 代码可以向您提供要点 - 它实际上非常简单。
class DataReader implements Runnable {
private final DataSource dataSource;
public DataReader(String location) {
dataSource = new DataSource(location);
Thread thread = new Thread(this);
thread.setDaemon(false);
thread.start();
}
public void run() {
while (dataSource.hasData()) {
MyImmutableObject newData = dataSource.getSomeData();
Platform.runLater(() -> MyApplication.changeScene(newData));
}
}
}
class MyApplication extends Application {
public void changeScene(MyImmutableObject newData) {
FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"layout.fxml"
)
);
UIController controller =
loader.<UIController>getController();
controller.initData(newData);
Scene scene = new Scene((Pane) loader.load());
stage.setScene(newScene);
}
}
上面的示例使用虚构的 DataSource、MyImmutableObject 和 UIController 类以及虚构的 FXML 模板来演示该概念(因此该代码段不是一个独立的可运行的东西)。 FXML加载概念来自:Passing Parameters JavaFX FXML 。示例代码创建了自己的线程,但如果您使用的任何库都已经创建了线程本身(这很可能),则无需创建另一个线程,您只需使用 Platform.runLater 调用将适当的 Hook 添加到现有库中即可获取事件通知并在库线程和 JavaFX 应用程序之间传递数据。
相关问题
关于 Platform.runLater 与 StackOverflow 上的任务还有许多其他问题:
其他问题
in my case, the administrator will be able, in some cases, to send an initial information to the kiosk, almost like an (initialization vector), for example the passport number. With this information, still the Platform.runLater the best solution?
是的,Platform.runLater 仍然是最好的解决方案。当管理员将信息发送到信息亭(例如嵌入式 http 服务器上的 servlet 或 jax-rs 服务)时,您将有一些线程收到警报,并且它可以调用 Platform.runLater 以根据该信息更新基于 JavaFX 的信息亭 UI。
关于java - 在某些外部事件后切换 javafx/jrubyfx 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26823040/
如何指示 webpack 排除所有 d3 模块? // does not work externals: { "d3-*": "d3" } 所以如果应用导入了d3-submod
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: What does “outer =>” really mean? 我在哪里可以找到有关信息 trait After
这是一个简单的循环,我正在尝试对性能进行基准测试。 var extremeLoop=function(n){ var time=new Date() var t=0; for(
问题+概述 下面是两个片段,其中包含最初隐藏的 div,然后通过单击 button 和 jQuery 的 .show() 显示。两个 div 都具有由外部样式表应用的 display: grid; 样
我有一个 HTML 页面和一个单独的 .js 文件,该文件包含在带有 的页面中标签。 这是我的 .js 文件: element = document.getElementById("test");
我在 linux 静态库项目中有 3 个文件,我想在两个类方法实现文件中使用的静态字段存在链接问题。我有 class1.h、class1main.cpp 和 class1utils.cpp。 clas
我正在尝试将颜色背景更改为默认背景颜色,当我点击输入框外 我尝试使用“null”或“none”但没有用? window.addEventListener('click', outsideClick);
我正在编写一个应用程序,要求用户在手机上选择各种类型的文件。我使用此代码启动文件选择器 Intent : Intent intent = new Intent(Intent.ACTION_GET_C
在 android 中,不可移动(内部)的外部存储和内部存储有什么区别?我不确定在哪里保存我的数据。我只需要保存一个人可以随时提取的游戏统计数据 谢谢 最佳答案 在许多较新的设备中,将不再有物理区别,
在 C++ 中,假设我们有这个头文件: myglobals.h #ifndef my_globals_h #define my_globals_h int monthsInYear = 12; #en
我正在尝试使用 externs 在 C++ 中连接到 Ada。这两种实现有什么区别? 实现A namespace Ada { extern "C" { int getN
这个问题在这里已经有了答案: Get selected element's outer HTML (30 个答案) 关闭 2 年前。 想象一下我们有这样的东西: Hello World 如果我们这样
假设我在模块的顶部有这个: Public Declare Function getCustomerDetails Lib "CustomerFunctions" () As Long 如果我从 VB6
我目前正在使用这段代码: var wordRandomizer = { run: function (targetElem) { var markup = this.creat
我们正在使用 SVN 试水,并以 Beanstalk 作为主机。我们的设置如下所示: 存储库:模块 模块一 模块二 模块 3 存储库:网站1 自定义网站代码 svn:对模块 1 的外部引用 svn:对
有没有办法在负载均衡器中设置自动外部 IP 分配给像谷歌这样的服务? 我在裸机上运行 Kubernetes。 谢谢 最佳答案 使用 nodePort 类型的服务,它会将您的服务绑定(bind)到所有节
是否有可能在 Controller 之外使用 generateUrl() 方法? 我尝试在带有 $this->get('router') 的自定义存储库类中使用它,但它没有用。 更新 我在这里找到了一
我目前正在尝试通过 Webpack 外部对象外部化 Angular 依赖项来缩短构建时间。到目前为止,我已经为 React 和其他小库实现了这一目标。 如果我只是移动 '@angular/compil
我想创建一个自动应用其他插件的插件(外部插件)。这要求在我称为“应用插件”之前为插件设置构建脚本依赖项。但是似乎我无法在插件中添加buildscript依赖项,或者得到了: 您不能更改处于未解析状态的
我是R包的创建者EnvStats . 有一个我经常使用的函数,叫做 stripChart .我刚开始学习ggplot2 ,并在过去几天里仔细研究了 Hadley 的书、Winston 的书、Stack
我是一名优秀的程序员,十分优秀!