JavaFX使用控制器从另一个类更改标签文本

时间:2015-02-15 18:23:50

标签: javafx controller label javafx-8

我想用另一个类的控制器更改Label的文本。我在FXMLDocumentController中创建了一个方法,它将文本设置为标签:

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)”方法时,程序会将正确的文本写入控制台。

但是,为什么?

抱歉我的英文不好,这不是我的母语:)。

谢谢, 的儒略

1 个答案:

答案 0 :(得分:2)

您没有更新标签,因为您在使用FXMLoader时正在创建另一个FXMLDocumentController实例。

您应该将包含标签的控制器实例设置为其他类的参数。

您可以在下面找到可以解决您需求的代码。在这里,我将Controller实例设置为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);
    }

}

注意:

如果您的例程需要更长的时间来执行它需要的任何内容,您可能希望使用任务,因此您不会冻结您的UI。要更新Label,您必须绑定text属性,然后使用updateMessage()方法更新Text值。

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