Java 从控制器访问域对象

Java 从控制器访问域对象,java,model-view-controller,javafx,javafx-8,fxml,Java,Model View Controller,Javafx,Javafx 8,Fxml,根据文档FXML可以被认为是MVC的“视图”部分。域对象在Java端定义(“模型”)。我找不到“M”和“C”之间的连接-我想从控制器修改一些域对象(或启动修改):“M”您可以创建实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器 不要使用静态fxmlo

根据文档FXML可以被认为是MVC的“视图”部分。域对象在Java端定义(“模型”)。我找不到“M”和“C”之间的连接-我想从控制器修改一些域对象(或启动修改):“M”您可以创建实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器

您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器

您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器

您可以创建的实例并使用非静态加载方法(或)。之后,您可以使用该方法获取控制器

不要使用静态
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();
请注意,对于此版本:

  • 包含的任何FXML文件都将使用相同的控制器工厂,因此,如果它们的控制器有一个构造函数,该构造函数接受类型为
    Model
    的单个参数,那么它们将收到对相同
    Model
    实例的引用
  • 如果在应用程序中使用多个
    FXMLLoader
    s,则可以重用同一控制器工厂将相同的
    模型
    实例传递给加载程序,以便所有控制器都可以访问相同的
    模型
    实例
  • 关于控制器工厂的其他想法

    控制器工厂是一个非常强大和灵活的机制。例如,很容易定义一个控制器工厂,该工厂只需延迟到Spring
    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();
    
    请注意,对于此版本:

  • 包含的任何FXML文件都将使用相同的控制器工厂,因此,如果它们的控制器有一个构造函数,该构造函数接受类型为
    Model
    的单个参数,那么它们将收到对相同
    Model
    实例的引用
  • 如果在应用程序中使用多个
    FXMLLoader
    s,则可以重用同一控制器工厂将相同的
    模型
    实例传递给加载程序,以便所有控制器都可以访问相同的
    模型
    实例
  • 关于控制器工厂的其他想法

    控制器工厂是一个非常强大和灵活的机制。例如,很容易定义一个控制器工厂,该工厂只需延迟到Spring
    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();
    
    请注意,对于此版本:

  • 包含的任何FXML文件都将使用相同的控制器工厂,因此,如果它们的控制器有一个构造函数,该构造函数接受类型为
    Model
    的单个参数,那么它们将收到对相同
    Model
    实例的引用
  • 如果在应用程序中使用多个
    FXMLLoader
    s,则可以重用同一控制器工厂将相同的
    模型
    实例传递给加载程序,以便所有控制器都可以访问相同的
    模型
    实例
  • 关于控制器的其他想法