2015-02-15 3 views
1

Я хочу изменить текст метки с помощью контроллера из другого класса. Я сделал метод в FXMLDocumentController, который устанавливает текст на этикетке:JavaFX Изменить текст метки из другого класса с помощью контроллера

public void setLabelText(String text) 
{ 
    lbZeit.setText(text); 
} 

Теперь я хочу, чтобы изменить этот текст из другого класса, как мой SerialHandlerClass. Во-первых, мне нужен контроллер, верно? Так что я сделал это:

FXMLLoader loader = new FXMLLoader(FXMLDocumentController.class.getResource("FXMLDocument.fxml")); 
loader.load(); 
controller = (FXMLDocumentController) loader.getController(); 

Теперь я бегу метод "setLabelText" ....

controller.setLabelText("asd"); 

... и ничего не происходит ...

Это очень смешно, потому что когда Я добавляю System.out.println(text); к методу setLabelText (String text), программа записывает правильный текст в консоль.

Но почему?

Извините за мой плохой английский, это не мой родной язык :)

Спасибо, Джулиан

+0

Откуда берутся lbZeit? Вы (правильно) вводите его с помощью @FXML? Вы (неправильно) присваиваете ему значение с помощью lbZeit = new Label()? Is lbZeit null? У вас есть fx: id = "lbZeit" (не id = "lbZeit") в вашем FXML? – jewelsea

+0

Спасибо за ваш ответ! Я сделал все эти шаги, и если я выполняю функцию в том же классе, что и метод setLablText, все работает отлично! Может быть, мне нужно обновить интерфейс от другого класса? – Stjubit

+0

Нет, вам не нужно обновлять пользовательский интерфейс из другого класса. Недостаточно информации для решения вашей проблемы. Измените свой вопрос, чтобы включить ответы на вопросы, которые я задал, - в том числе [mcve] (http://stackoverflow.com/help/mcve). – jewelsea

ответ

2

Вы не обновляя этикетку, потому что вы создаете еще один экземпляр FXMLDocumentController при использовании FXMLoader ,

Вы должны установить экземпляр контроллера, который содержит метку, в качестве параметра для другого класса.

У вас есть код, который может решить вашу проблему. Здесь я установил экземпляр контроллера для класса Connector, так что вы можете вызвать метод setLabelText из другого класса:

public class Connector { 
    public static void Connecting(FXMLDocumentController controller) { 
     try { 
      System.out.println("Connector.Connecting(): Called"); 
      controller.setLabelText("Bye World"); 
     } catch (IOException ex) { 
      Logger.getLogger(Connector.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 


public class FXMLDocumentController implements Initializable { 

    @FXML 
    private Label label; 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 
     System.out.println("FXMLDocumentController.#handleButtonAction"); 
     label.setText("Hello World!"); 
     Connector.Connecting(this); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    }  

    public void setLabelText(String text) 
    { 
     System.out.println("FXMLDocumentController.setLabelText(): Called"); 
     label.setText(text); 
    } 

} 

Примечание:

Если процедура будет занимать больше времени, чтобы выполнить независимо его вам нужно использовать задачу, чтобы вы не затормозили свой пользовательский интерфейс. Чтобы обновить метку, вам необходимо привязать свойство текста, а затем обновить значение «Текст», используя метод updateMessage().

public class FXMLDocumentController implements Initializable { 

    @FXML 
    private Label label; 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 
     System.out.println("FXMLDocumentController.#handleButtonAction"); 
     label.setText("Hello World!"); 

     Task<Boolean> connectorTask = new ConnectorTask(); 
     label.textProperty().bind(connectorTask.messageProperty()); 
     connectorTask.setOnSucceeded(e -> { 
      // this is going to be called if the task ends up without error 
      label.textProperty().unbind(); 
     }); 
     new Thread(connectorTask).start(); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    }  

    //public void setLabelText(String text) 
    //{ 
    // System.out.println("FXMLDocumentController.setLabelText(): Called"); 
    // label.setText(text); 
    //} 


    public class ConnectorTask extends Task<Boolean> { 

     @Override 
     protected Boolean call() throws Exception { 
      // ... do whatever you need here 

      // then you call this method to update the TextProperty from the Label that was bound. 
      updateMessage("Bye World"); 

      return Boolean.TRUE; 
     } 
    } 

} 

Примечание:

Существует возможный дубликат вопрос для этого, смотрите мой ответ на этот вопрос here!

+0

Хорошо, я отредактирую ответ. Tks. – henriqueor

+0

Hi henriqueor, спасибо за редактирование, действительно, может быть полезно отметить дубликаты, если вы их найдете. – bummi

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