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

如何在我的案例中使用javaFX任务-不重复

洪飞扬
2023-03-14

我知道我的问题有答案,但我不理解代码中的问题。

为什么我得到:

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

我正试图使用controller类中的方法将任务中的文本添加到文本流中,由于某些原因,程序无法运行。getChildren()方法。

在控制器类中调用拆分器:

btnSplit.setOnMouseClicked(new EventHandler<Event>() {
            @Override
            public void handle(Event event) {
                Thread split = new Thread(new Spliter(custToSplit, Controller.this));
                split.setDaemon(true);
                split.start();

            }
        });

类拆分构造函数:

public Spliter(File f, Controller c){
        this.c = c;
        this.cust = f;

    }
c.updateHebFlow("Dir created: "+ newDir.getAbsolutePath() , INFO_TEXT);

控制器类的一部分:

@FXML
    private TextFlow hebFlow;
@Override
    public void initialize(URL location, ResourceBundle resources) {
assert hebFlow != null : "fx:id=\"hebFlow\" was not injected: check your FXML file 'MainXml.fxml'.";

    public void updateHebFlow(String text,String type){
        normalText = new Text();
        errorText = new Text();
        errorText.setFill(Color.RED);
        infoText = new Text();
        infoText.setFill(Color.BLUE);
        switch(type){
        case(ERROR_TEXT) :
            errorText.setText(text);
            hebFlow.getChildren().addAll(new Text("/n"), errorText);
            break;
        case(INFO_TEXT) :
            infoText.setText(text);
            hebFlow.getChildren().addAll(new Text("/n"), infoText);
            break;
        case(NORMAL_TEXT) :
            normalText.setText(text);
            hebFlow.getChildren().addAll(new Text("/n"), normalText);
            break;
        }
    }   
}

在拆分器类中调用updateHebFlow:

try{
c.updateHebFlow("Script by TulTul", INFO_TEXT);
}catch (Exception e){
            e.printStackTrace();
        }

据我所知,除了控制器之外,我不能从其他类更改UI,所以我在控制器类中创建了一个方法,该方法将进行更改并在任务类中调用它,为什么我得到这个异常?如果这是错误的,那么wright方法是什么?

共有1个答案

易成双
2023-03-14

据我所知,我不能从其他类更改UI,然后控制器

实际上,正确的说法是:“除了JavaFX UI线程之外,您不能从任何线程更改UI”。因此,解决方案是使用平台。从拆分器运行later(),如下所示:

// Java 8
Platform.runLater(() -> {
    c.updateHebFlow("Script by TulTul", INFO_TEXT);
});

// Java 7
Platform.runLater(new Runnable() {
    public void run() {
        c.updateHebFlow("Script by TulTul", INFO_TEXT);
    }
});

Platform.run稍后()保证在JavaFX UI线程中按调用顺序运行块。

 类似资料:
  • 问题内容: 我已经使用JavaFX制作了GUI,并且有三个单选按钮,一旦用户单击“提交”并创建了另一个线程,并且根据检查的单选按钮,该线程将运行所需的输出并将结果输出到控制台。 但是,当线程正在运行时(一个过程大约需要30秒才能完成),我可以检查任何单选按钮。为此,它创建另一个线程,并与其他正在进行的线程长时间输出。所以我的输出盒简直是一团糟!我正在查看 异步 任务,但不确定是否与此相关。 这是我

  • 我正在使用Intellij Idea在MacOS上用Java编写代码。我安装了在官方网站上下载的JDK Java 11。Java工作很好。但是,现在我想使用JavaFX库。 因此,我使用导入JavaFX 但我得到错误:。 所以我搜索了一小段,发现我必须将项目创建为“JavaFX应用程序”,所以我这样做了,但在文件中我得到的消息是: 未配置JavaFX运行时。或者使用内置JavaFX的JDK,或者向

  • 我使用JavaFX制作了一个GUI,有三个单选按钮,一旦用户单击提交并创建了另一个线程,并且根据检查了什么单选按钮,线程运行所需的输出并将结果输出到控制台。 但是当线程运行时(一个进程需要大约30秒才能完成),我可以检查任何放射性按钮。它创建另一个线程并与另一个正在进行的线程一起输出长时间。所以我的输出框只是一个乱七八糟的东西!我在看异步任务,但我不确定这是否与它有关。 以下是我需要的:如果一个任

  • 问题内容: 我在Java文档中看到了这一点:ScheduledAtFixedRate,它说 如果该任务的任何执行遇到异常,将禁止后续执行 我不希望在我的应用程序中发生这种情况。即使看到异常,我也总是希望后续执行继续进行。我怎样才能从。 问题答案: 用try / catch包围Callable.call方法或Runnable.run方法… 例如: 请注意,捕获除编译器也告诉您的内容之外的其他内容(在

  • JCIP-的摘要 如果一个周期性计时器任务计划每10毫秒运行一次,而另一个计时器任务需要40毫秒才能运行,则周期性任务在长时间运行的任务完成后会被快速连续调用四次(取决于它是以固定速率还是固定延迟调度的),或者完全“错过”四次调用。 我知道,由于第一个任务计划每10毫秒运行一次,因此在40毫秒内,它将执行4次。 但作者所说的完全错过四次调用是什么意思呢?