JavaFX使用控制器更改另一个类中的标签文本
我想用另一个类中的控制器更改标签的文本。我在FXMLDocumentController中创建了一个方法,用于将文本设置为标签: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
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的可能重复项,谢谢编辑,如果您发现重复项,标记重复项可能会很有用。