我想用另一个类的控制器更改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)”方法时,程序会将正确的文本写入控制台。
但是,为什么?
抱歉我的英文不好,这不是我的母语:)。
谢谢, 的儒略
答案 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!