Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaFXMVC中通过模型更新视图?_Java_Model View Controller_Javafx_Fxml - Fatal编程技术网

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

如何在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

我有带有模型、视图和控制器的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);
   }
}
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框架)感兴趣。