2015-06-03 4 views
0

Я знаю, что есть ответы на мои вопросы, но я не понял проблему в своем коде.Как использовать javaFX Task в моем случае - Не дублировать

Почему я получаю:

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

      } 
     }); 

класс Spliter constractor:

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 в классе Spliter:

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

Из чего я понимаю, я не могу изменить пользовательский интерфейс другого класса, кроме контроллера, поэтому Ive сделал метод в классе контроллера, который внесет изменения и вызовет его в классе Task, почему я получаю это исключение ? Если это неправильно, то что это за ошибка?

ответ

1

Из того, что я понимаю, что я не могу изменить интерфейс от другого класса другой, то контроллер

На самом деле правильное утверждение: «Вы не можете изменить интерфейс с любого нити, кроме интерфейса JavaFX нить". Таким образом, решение заключается в использовании Platform.runLater() из Splitter как:

// 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 и в порядке вызова.

+0

Спасибо, наконец, он работает –

Смежные вопросы