【问题标题】:How to use javaFX Task in my case - Not duplicate在我的情况下如何使用 javaFX Task - 不重复
【发布时间】:2015-08-17 06:09:39
【问题描述】:

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

为什么我得到:

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

我正在尝试使用控制器类中的方法将文本从任务添加到文本流,由于某种原因程序在 .getChildren() 方法上失败。

在控制器类中调用 Spliter:

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);

Controller类的一部分:

@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;
        }
    }   
}

在 Spliter 类中调用 updateHebFlow:

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

据我了解,除了控制器之外,我无法从其他类更改 UI,因此我在控制器类中创建了一个方法,该方法将进行更改并在 Task 类中调用它,为什么会出现此异常? 如果这是错误的,那么正确的方法是什么?

【问题讨论】:

    标签: java user-interface javafx task


    【解决方案1】:

    据我了解,除了控制器之外,我无法更改其他类的 UI

    实际上正确的说法是:“您不能从除 JavaFX UI 线程之外的任何 线程 更改 UI”。因此,解决方案是使用Splitter 中的Platform.runLater() 作为:

    // 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.runLater() 保证在 JavaFX UI 线程中按调用顺序运行块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 2021-09-24
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      相关资源
      最近更新 更多