如何在JavaFX MVC中通过模型更新视图?

时间:2018-01-06 20:08:36

标签: 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 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;
   }
}

我的项目中还有另一个类,它们调用setPositon方法并更新变量位置。当有人在Model类中更改位置变量时,有没有办法在我的视图中更改Text?

1 个答案:

答案 0 :(得分:1)

您需要观察模型。在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属性并手动设置控制器&#34;&#34;:

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

另请参阅相关问题Applying MVC With JavaFx