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

JavaFX使用控制器更改另一个类中的标签文本,javafx,controller,label,javafx-8,Javafx,Controller,Label,Javafx 8,我想用另一个类中的控制器更改标签的文本。我在FXMLDocumentController中创建了一个方法,用于将文本设置为标签: public void setLabelText(String text) { lbZeit.setText(text); } 现在我想从另一个类(如SerialHandlerClass)更改此文本。首先,我需要控制器,对吗?所以我这样做了: FXMLLoader loader = new FXMLLoader(FXMLDocumentController.cl

我想用另一个类中的控制器更改标签的文本。我在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)”方法,程序将正确的文本写入控制台

但是,为什么

对不起,我的英语不好,这不是我的母语:)

谢谢,
Julian

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

您应该将包含标签的控制器实例设置为另一个类的参数

下面是可以解决您需求的代码。在这里,我将控制器实例设置为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。要更新标签,必须绑定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;
        }
    }

}
公共类FXMLDocumentController实现可初始化{
@FXML
自有品牌;
@FXML
私有无效把手按钮操作(ActionEvent事件){
System.out.println(“FXMLDocumentController.#HandleButtoAction”);
label.setText(“你好,世界!”);
Task connectorTask=新建connectorTask();
label.textProperty().bind(connectorTask.messageProperty());
connectorTask.SetOnSucceed(e->{
//如果任务结束时没有错误,将调用此函数
label.textProperty().unbind();
});
新线程(connectorTask).start();
}
@凌驾
公共void初始化(URL、ResourceBundle rb){
//待办事项
}    
//公共void setLabelText(字符串文本)
//{
//System.out.println(“FXMLDocumentController.setLabelText():调用”);
//label.setText(文本);
//}
公共类ConnectorTask扩展任务{
@凌驾
受保护的布尔调用()引发异常{
//…你需要什么就做什么
//然后调用此方法从绑定的标签更新TextProperty。
更新消息(“再见世界”);
返回Boolean.TRUE;
}
}
}
注意:


有一个可能重复的问题,请看我的回答这个问题

它来自哪里?您是否(正确地)使用@FXML注入它?是否(错误地)使用lbZeit=new Label()为其赋值?它是空的吗?您的FXML中有fx:id=“lbZeit”(不是id=“lbZeit”)吗?谢谢您的回答!我已经完成了所有这些步骤,如果我在与“setlabletext”方法相同的类中执行该函数,那么它就可以完美地工作!是否我必须从另一个类更新UI?不,您不必从另一个类更新UI。没有足够的信息来解决您的问题。请编辑您的问题,以包括我所问问题的答案-包括一个就足够了。Hi henriqueor的可能重复项,谢谢编辑,如果您发现重复项,标记重复项可能会很有用。