Java 从控制器访问域对象
根据文档FXML可以被认为是MVC的“视图”部分。域对象在Java端定义(“模型”)。我找不到“M”和“C”之间的连接-我想从控制器修改一些域对象(或启动修改):“M”您可以创建实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 不要使用静态Java 从控制器访问域对象,java,model-view-controller,javafx,javafx-8,fxml,Java,Model View Controller,Javafx,Javafx 8,Fxml,根据文档FXML可以被认为是MVC的“视图”部分。域对象在Java端定义(“模型”)。我找不到“M”和“C”之间的连接-我想从控制器修改一些域对象(或启动修改):“M”您可以创建实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 不要使用静态fxmlo
fxmloader.load(URL)
方法。相反,创建一个fxmloader
实例。然后您可以自己实例化控制器并调用setController(…)
,也可以设置控制器工厂
使用设置控制器(…)
因此,假设您有一些模型类,将其称为model
。定义控制器以引用它:
public class MyController {
private final Model model ;
// usual @FXML-annotated fields, etc
public MyController(Model model) {
this.model = model ;
}
public void initialize() { ... }
// handler methods, etc...
}
现在,从FXML文件中删除fx:controller
属性,改为执行以下操作:
final Model model = new Model();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("path/to/fxml/file.fxml"));
loader.setController(new MyController(model));
Parent root = loader.<Parent>load();
请注意,对于此版本:
Model
的单个参数,那么它们将收到对相同Model
实例的引用FXMLLoader
s,则可以重用同一控制器工厂将相同的模型
实例传递给加载程序,以便所有控制器都可以访问相同的模型
实例ApplicationContext
。这样,您就可以为控制器定义接口,只需在FXML文件中指定接口名称。然后,您的Spring配置文件可以确定要使用哪个控制器接口实现,当然也可以为您将模型(和域对象)注入控制器
另请参见
如果你做了很多这方面的工作,看看。Adam定义了一个可重用的控制器工厂,该工厂加载控制器并检查其中的
@Inject
注释字段,并向这些字段中注入一个单例实例。这提供了很大的灵活性,因为您可以轻松地向控制器添加更多共享资源。不要使用静态fxmloader.load(URL)
方法。相反,创建一个fxmloader
实例。然后您可以自己实例化控制器并调用setController(…)
,也可以设置控制器工厂
使用设置控制器(…)
因此,假设您有一些模型类,将其称为model
。定义控制器以引用它:
public class MyController {
private final Model model ;
// usual @FXML-annotated fields, etc
public MyController(Model model) {
this.model = model ;
}
public void initialize() { ... }
// handler methods, etc...
}
现在,从FXML文件中删除fx:controller
属性,改为执行以下操作:
final Model model = new Model();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("path/to/fxml/file.fxml"));
loader.setController(new MyController(model));
Parent root = loader.<Parent>load();
请注意,对于此版本:
Model
的单个参数,那么它们将收到对相同Model
实例的引用FXMLLoader
s,则可以重用同一控制器工厂将相同的模型
实例传递给加载程序,以便所有控制器都可以访问相同的模型
实例ApplicationContext
。这样,您就可以为控制器定义接口,只需在FXML文件中指定接口名称。然后,您的Spring配置文件可以确定要使用哪个控制器接口实现,当然也可以为您将模型(和域对象)注入控制器
另请参见
如果你做了很多这方面的工作,看看。Adam定义了一个可重用的控制器工厂,该工厂加载控制器并检查其中的
@Inject
注释字段,并向这些字段中注入一个单例实例。这提供了很大的灵活性,因为您可以轻松地向控制器添加更多共享资源。不要使用静态fxmloader.load(URL)
方法。相反,创建一个fxmloader
实例。然后您可以自己实例化控制器并调用setController(…)
,也可以设置控制器工厂
使用设置控制器(…)
因此,假设您有一些模型类,将其称为model
。定义控制器以引用它:
public class MyController {
private final Model model ;
// usual @FXML-annotated fields, etc
public MyController(Model model) {
this.model = model ;
}
public void initialize() { ... }
// handler methods, etc...
}
现在,从FXML文件中删除fx:controller
属性,改为执行以下操作:
final Model model = new Model();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("path/to/fxml/file.fxml"));
loader.setController(new MyController(model));
Parent root = loader.<Parent>load();
请注意,对于此版本:
Model
的单个参数,那么它们将收到对相同Model
实例的引用FXMLLoader
s,则可以重用同一控制器工厂将相同的模型
实例传递给加载程序,以便所有控制器都可以访问相同的模型
实例