如何通过 JavaFX MVC 中的模型更新视图?
How to update view via model in JavaFX MVC?
我有带有模型、视图和控制器的 FXML 应用程序。我的视图在 .fxml 文件中,我在那里有这样的文本
<Text fx:id="position" text="None" GridPane.columnIndex="1" GridPane.rowIndex="3">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
我的控制器是这样的
public class Controller{
@FXML
private Text position;
public void updatePosition(String text){
position.setText(text);
}
}
在我的模型中,我有一个 String 变量,它在我的所有项目中都在变化。模型看起来像这样
public class Model {
public String position = "None";
public String getPosition() {
return tactic;
}
public void setPosition(String position) {
this.position = position;
}
}
我的项目中还有一个class调用setPositon方法更新变量位置。当有人更改模型 class 中的位置变量时,有没有办法在我看来更改文本?
您需要观察模型。在 JavaFX 中执行此操作的最简单方法是使用 JavaFX properties 来表示数据。
public class Model {
private final StringProperty position = new SimpleStringProperty("None");
public StringProperty positionProperty() {
return position ;
}
public final String getPosition() {
return positionProperty().get();
}
public final void setPosition(String position) {
positionProperty().set(position);
}
}
现在只需将文字的textProperty()
绑定到模特的positionProperty()
,如果模特的位置发生变化,文字会自动更新:
public class Controller{
@FXML
private Text position;
private Model model ;
public void initialize() {
position.textProperty().bind(model.positionProperty());
}
// ...
}
现在唯一棘手的部分是确保控制器具有对正确模型实例的引用。最好的方法是为采用模型的控制器提供构造函数:
public class Controller {
@FXML
private Text position;
private final Model model ;
public Controller(Model model) {
this.model = model ;
}
public void initialize() {
position.textProperty().bind(model.positionProperty());
}
// ...
}
现在的问题是,通过 FXMLLoader
创建控制器的默认机制依赖于零参数构造函数,因此它无法工作。所以你需要从 FXML 文件中删除 fx:controller
属性并设置控制器 "by hand":
Model model = new Model(); // or just reference to existing model...
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.setController(new Controller(model));
Parent root = loader.load();
// ...
model.setPosition("Left"); // will update text in view
有关将模型(或其他数据)传递给控制器的更多方法,请参阅 Passing Parameters JavaFX FXML。
另见相关问题
我有带有模型、视图和控制器的 FXML 应用程序。我的视图在 .fxml 文件中,我在那里有这样的文本
<Text fx:id="position" text="None" GridPane.columnIndex="1" GridPane.rowIndex="3">
<font>
<Font name="System Bold" size="18.0" />
</font>
</Text>
我的控制器是这样的
public class Controller{
@FXML
private Text position;
public void updatePosition(String text){
position.setText(text);
}
}
在我的模型中,我有一个 String 变量,它在我的所有项目中都在变化。模型看起来像这样
public class Model {
public String position = "None";
public String getPosition() {
return tactic;
}
public void setPosition(String position) {
this.position = position;
}
}
我的项目中还有一个class调用setPositon方法更新变量位置。当有人更改模型 class 中的位置变量时,有没有办法在我看来更改文本?
您需要观察模型。在 JavaFX 中执行此操作的最简单方法是使用 JavaFX properties 来表示数据。
public class Model {
private final StringProperty position = new SimpleStringProperty("None");
public StringProperty positionProperty() {
return position ;
}
public final String getPosition() {
return positionProperty().get();
}
public final void setPosition(String position) {
positionProperty().set(position);
}
}
现在只需将文字的textProperty()
绑定到模特的positionProperty()
,如果模特的位置发生变化,文字会自动更新:
public class Controller{
@FXML
private Text position;
private Model model ;
public void initialize() {
position.textProperty().bind(model.positionProperty());
}
// ...
}
现在唯一棘手的部分是确保控制器具有对正确模型实例的引用。最好的方法是为采用模型的控制器提供构造函数:
public class Controller {
@FXML
private Text position;
private final Model model ;
public Controller(Model model) {
this.model = model ;
}
public void initialize() {
position.textProperty().bind(model.positionProperty());
}
// ...
}
现在的问题是,通过 FXMLLoader
创建控制器的默认机制依赖于零参数构造函数,因此它无法工作。所以你需要从 FXML 文件中删除 fx:controller
属性并设置控制器 "by hand":
Model model = new Model(); // or just reference to existing model...
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.setController(new Controller(model));
Parent root = loader.load();
// ...
model.setPosition("Left"); // will update text in view
有关将模型(或其他数据)传递给控制器的更多方法,请参阅 Passing Parameters JavaFX FXML。
另见相关问题