当前位置: 首页 > 知识库问答 >
问题:

JavaFX处理线程和GUI

颜德馨
2023-03-14

我在使用JavaFX和线程时遇到问题。基本上我有两个选择:使用任务平台。稍后运行。据我所知,平台。runLater应用于简单/简短的任务,而任务应用于较长的任务。然而,我不能使用它们中的任何一个。

当我调用线程时,它必须在任务执行过程中弹出一个验证码对话框。在使用任务时,它忽略了我显示新对话框的请求。。。它不允许我创造一个新的舞台。

另一方面,当我使用平台时。runLater,它允许我显示一个对话框,但是,程序的主窗口会冻结,直到显示弹出对话框。

我需要任何解决办法。如果有人知道如何处理这个问题,或者有过类似的经验,并找到了解决方案,我期待着您的回复!

共有3个答案

孙成化
2023-03-14

现在回答这个问题已经太迟了,但对于那些有错误的人来说,这里有一个解决方案XD

你可以用一根线。

线程中的runnablerunlater使用lambda表达式。

Thread t = new Thread(() -> {
        //Here write all actions that you want execute on background

        Platform.runLater(() -> {
            //Here the action where is finished the actions on background
        });
    });
t.start();
吉嘉珍
2023-03-14

如果您想在后台执行某些操作,请使用JavaFX应用程序线程中的工作者(任务服务)。

http://docs.oracle.com/javafx/2/api/javafx/concurrent/package-summary.html

使用平台。如果您想在JavaFX应用程序线程上执行某些操作,请稍后从后台线程运行。

http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater(java.lang.Runnable)

杨彦君
2023-03-14

正如puce所说,你必须在后台使用任务或服务。和Platform.run稍后从后台线程在JavaFX Application线程中做事情。

您必须同步它们,其中一种方法是使用类CountDownLatch

下面是一个例子:

Service<Void> service = new Service<Void>() {
        @Override
        protected Task<Void> createTask() {
            return new Task<Void>() {           
                @Override
                protected Void call() throws Exception {
                    //Background work                       
                    final CountDownLatch latch = new CountDownLatch(1);
                    Platform.runLater(new Runnable() {                          
                        @Override
                        public void run() {
                            try{
                                //FX Stuff done here
                            }finally{
                                latch.countDown();
                            }
                        }
                    });
                    latch.await();                      
                    //Keep with the background work
                    return null;
                }
            };
        }
    };
    service.start();
 类似资料:
  • 我今天才开始学习JavaFX,我试图通过制作一个Snake克隆来了解更多,但是我在线程方面遇到了麻烦。我想创建一个线程来更新蛇在屏幕上的位置,但是不能以正常的Runnable线程方式使用它,因为我在线程中使用JavaFX来更新绘制到屏幕上的矩形的位置(我知道你不能这样做,必须使用任务,服务,Platform.run稍后,等等?)我创建线程的类扩展了JavaFX。scene.layout.窗格,我试

  • Python 2.7。3 x64 wxPython 2.8 x64 我已经阅读了很多关于python线程和多处理的文章,特别是Doug Hellmann的一些文章,这些文章帮助很大。然而,我对一件事感到困惑。。。 我认为Python多处理模块或多或少是线程模块的替代品,只是args必须是可拾取的,但是我发现为了不阻塞我的GUI,我必须首先使用线程创建一个新线程。线程,然后在该线程内通过多处理进行多

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 我目前正在处理一批数据,这些数据来自一个拥有数百万行的大型SQL数据库。 它在处理器中执行一些处理,包括通过带有连接的大型sql查询对从Reader检索到的行进行分组。 编写器将结果写入另一个表。 问题是此Batch存在性能问题,因为Sql选择查询需要大量时间并且步骤不会在多线程中执行。 因此,我希望在多标题中运行它们,但问题是,这些步骤通过计算具有相同类型的所有行的总数来对行进行分组。 因此,如

  • 线程中使用 java.lang.Runnable 如果用户在代码中通过 java.lang.Runnable 新启动了线程或者采用了线程池去异步地处理一些业务,那么需要将 SOFATracer 日志上下文从父线程传递到子线程中去,SOFATracer 提供的 com.alipay.common.tracer.core.async.SofaTracerRunnable 默认完成了此操作,大家可以按照

  • 问题内容: 我试图了解Linux如何处理进程调度和线程调度。我读过Linux可以安排进程和线程。 Linux是否具有线程调度程序和进程调度程序?如果是,他们如何合作? 问题答案: 的Linux内核调度器被实际调度的任务,并且这些要么螺纹或(单线程)工艺。 因此,在调度程序的上下文中, 任务 (内核内部)是正在调度的事物,可以是某些 内核线程( 例如或),多线程进程的某些 用户线程 (例如)或单线程