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

如何避免不在FX应用程序线程上;当前线程 = JavaFX 应用程序线程错误?

史逸春
2023-03-14

下面的代码片段给我错误< code >不在FX应用程序线程上;当前线程 = < code > Java FX < code >应用程序线程。这个应用程序在java 1.7中运行良好,但是当我把它移到fx8时,它现在出现错误。当我第一次尝试启动应用程序时,它按预期工作。但是在关闭并再次打开舞台后,它不起作用了。

错误也不明确Not On fx应用程序线程和当前线程-javafxapplication thread。如果当前线程是fx应用程序线程,那么不在fx应用线程上意味着什么。

java prettyprint-override">progressDialog = createProgressDialog(service);
progressDialog.show();
progressDialog.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        // if (service.isRunning()) {
        // service.cancel();
        progressDialog.close();
        // }
    }
});
@SuppressWarnings("unchecked")
private Stage createProgressDialog(final Service<IStatus> service) {
    stage = new Stage();

    URL url = FileLocator.find(Activator.getDefault().getBundle(),
    new Path("icons/xxx_16x16.png"), null); //$NON-NLS-1$
    stage.getIcons().add(new Image(url.getFile()));
    stage.setTitle("Downloading ..."); //$NON-NLS-1$
    // Creating StackPane
    stage.initModality(Modality.WINDOW_MODAL);
}

共有3个答案

百里君博
2023-03-14

当您尝试更改某些组件UI(如标签文本)时,应该会发生这种情况。这样跑步总是有效的:

@FXML Label myLabel;

Platform.runLater(new Runnable(){
   myLabel.setText("some text");
});
桂高义
2023-03-14

当我在javafx 2的task中修改UI元素(如listview元素)时,就发生了这种情况。一个修改场景图的任务帮助我解决了这个问题,即通过

 final ListView<String> group = new ListView ();

 Task<Void> task = new Task<Void>() {

     @Override protected Void call() throws Exception {

         group.getItems().clear();  

          for (int i=0; i<100; i++) {                
             Platform.runLater(new Runnable() {
                 @Override public void run() {
                     group.getItems.add(i);
                 }
             });
         }
         return null;
     }
 };
管炳
2023-03-14

打电话

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        // do your GUI stuff here
    }
});

会修好的。

 类似资料:
  • 问题内容: 我正在尝试从线程中设置文本对象的字符串,但这给了我这个错误: 处理程序类: 我尝试使用,它确实可以工作,但是它使我的程序崩溃。我也尝试在该方法上创建一个Timer,但它给了我与以前相同的错误。 问题答案: 包起来。在它的外面,在while循环中,添加Thread.sleep(1000); 非法状态异常的原因是你试图在JavaFX Application线程以外的其他线程上更新UI。 添

  • 问题内容: 我试图通过使用JInternalFrame附加JFXPanel来使用JavaFx 2.x和Swing应用程序 我的代码如下 我有这个例外 就我的目的而言,我必须使用JInternalFrame:如何解决此问题? 问题答案: 请参阅“ Swing中的JavaFX”教程。您正在执行应在Swing线程(事件调度线程)上的JavaFX线程上运行的JavaFX操作。 幸运的是,他们从以前的错误中

  • 我正试图通过使用一个JInternalFrame来使用JavaFx2.x和Swing应用程序,其中附加了一个JFXPanel 我在下面的代码 我有这个例外 对于我的目的,我必须使用JInternalFrame:我如何解决这个问题?

  • 问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了:

  • 我有一个简单的控制台应用程序,有时需要执行图形操作,对于那些我使用JavaFx框架(有一些功能,我需要像css样式的文本)我只是生成一些形状和文本到一个隐藏的场景,然后保存在文件中仅此而已, 我知道要使用JavaFx,我必须将图形操作传递给JavaFx线程,但是当一切都完成后,我必须关闭应用程序(几个小时后),这个JavaFx线程仍然保持打开...我真的不想强行退出System.exit(),因为

  • 当我创建一个简单的非多线程JavaFX应用程序并启动它时,该应用程序会创建一些线程(JavaFXApplicationThread、JavaFXLauncher等)。这些线程中的大多数都已命名,但在我的所有JavaFX应用程序中都有一个未命名的线程(“线程-1”或“线程-2”)。我绝对不会创建自己的线程,因为我尝试启动Hello World JavaFX应用程序(由IDEA生成),其中也包含“线程