如何在JavaFXMVC中通过模型更新视图?
我有带有模型、视图和控制器的FXML应用程序。我的视图在.fxml文件中,我的文本如下如何在JavaFXMVC中通过模型更新视图?,java,model-view-controller,javafx,fxml,Java,Model View Controller,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 Cont
<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);
}
}
public class Model {
public String position = "None";
public String getPosition() {
return tactic;
}
public void setPosition(String position) {
this.position = position;
}
}
在我的模型中,有一个字符串变量,它在整个项目中都在变化。模型看起来像这样
<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);
}
}
public class Model {
public String position = "None";
public String getPosition() {
return tactic;
}
public void setPosition(String position) {
this.position = position;
}
}
在我的项目中还有另一个类,它调用setposition方法并更新变量位置。当有人在模型类中更改位置变量时,有没有办法在我的视图中更改文本?您需要观察模型。在JavaFX中实现这一点的最简单方法是使用表示数据
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());
}
// ...
}
现在的问题是,通过fxmloader
创建控制器的默认机制依赖于零参数构造函数,因此无法工作。因此,您需要从FXML文件中删除fx:controller
属性,并“手动”设置控制器:
有关将模型(或其他数据)传递给控制器的更多方法,请参见
另请参见相关问题非常感谢:)它运行良好。还有一件事——当我创建这样的模型实例时
modelmodel=newmodel()代码>我必须在另一个类中使用这个实例,所以它必须是静态的,因为我不能生成扩展应用程序的类的实例。有没有办法不使用model?@M.Barabas的静态实例?如果您在start()
方法中创建它,您应该能够将它传递给需要它的任何控制器(或其他类),因为start()
方法是整个应用程序的入口点。这有时会变得有点复杂,在这种情况下,我建议使用依赖注入框架(如Guice、Weld或Spring)。您可能还对(本质上是一个特定于JavaFX的DI框架)感兴趣。