按照MVC模式在Java中实现JFileChooser

按照MVC模式在Java中实现JFileChooser,java,swing,model-view-controller,jfilechooser,Java,Swing,Model View Controller,Jfilechooser,如何/在Java的MVC架构中处理JFileChooser的最佳方式是什么?我的控制器正在侦听主GUI中的事件,并对其上的按钮起作用,即,控制器调用模型上的适当方法,然后控制器更新视图。问题是,现在我想添加一个JFileChooser,并想通过控制器用所选文件的完整路径更新模型。 我正在使用@Hovercraft开发的这个答案中的代码作为我项目的基础。 我怎样才能做到这一点呢?这是一个简单的版本。这个方法来自我的一个ActionListener类,它是由一个JMenuItem触发的 您必须将GU

如何/在Java的MVC架构中处理JFileChooser的最佳方式是什么?我的控制器正在侦听主GUI中的事件,并对其上的按钮起作用,即,控制器调用模型上的适当方法,然后控制器更新视图。问题是,现在我想添加一个JFileChooser,并想通过控制器用所选文件的完整路径更新模型。 我正在使用@Hovercraft开发的这个答案中的代码作为我项目的基础。
我怎样才能做到这一点呢?

这是一个简单的版本。这个方法来自我的一个ActionListener类,它是由一个JMenuItem触发的

您必须将GUI框架的实例和GUI模型的实例传递给包含此方法的类

protected int chooseOpenFile() {
    JFileChooser fileChooser = new JFileChooser(model.getSavedInputFile());

    int status = fileChooser.showOpenDialog(frame.getFrame());

    if (status == JFileChooser.APPROVE_OPTION) {
        File selectedFile = fileChooser.getSelectedFile();
        model.setSavedInputFile(selectedFile);
    }

    return status;
}

这是一个简单的版本。这个方法来自我的一个ActionListener类,它是由一个JMenuItem触发的

您必须将GUI框架的实例和GUI模型的实例传递给包含此方法的类

protected int chooseOpenFile() {
    JFileChooser fileChooser = new JFileChooser(model.getSavedInputFile());

    int status = fileChooser.showOpenDialog(frame.getFrame());

    if (status == JFileChooser.APPROVE_OPTION) {
        File selectedFile = fileChooser.getSelectedFile();
        model.setSavedInputFile(selectedFile);
    }

    return status;
}

谢谢你,Gilbert Le Blanc。我没有想到这一点,因为我不知道将模型引用传递给视图实际上是一种好的做法还是一种坏的做法。我将尝试这种方法,但我很有信心它会起作用。@PMMP:您必须将GUI框架的实例(指定JFrame)和GUI模型传递给大多数GUI类。从GUI模型读取和写入组件是防止GUI组件耦合的原因。在大型系统中,GUI模型与应用程序模型是分开的。GUI模型是MVC中的应用程序视图。谢谢。那真的很有帮助+对不起,Gilbert Le Blanc,我还有一个问题。我应该在哪里以及如何创建JFileChooser?我是否应该使用模型、视图和控制器在主类中创建它,将其设置为可见,作为对“打开文件”按钮上执行的操作的响应,然后将其设置为不可见?或者我应该每次在控制器中创建视图,作为对“打开文件”按钮上执行的操作的响应?您认为最好的方法是什么?您应该每次在控制器的ActionListener中创建视图,作为对“打开文件”按钮上执行的操作的响应。您还需要扩展JFileChooser。阅读这篇优秀文章以了解细节:谢谢你,Gilbert Le Blanc。我没有想到这一点,因为我不知道将模型引用传递给视图实际上是一种好的做法还是一种坏的做法。我将尝试这种方法,但我很有信心它会起作用。@PMMP:您必须将GUI框架的实例(指定JFrame)和GUI模型传递给大多数GUI类。从GUI模型读取和写入组件是防止GUI组件耦合的原因。在大型系统中,GUI模型与应用程序模型是分开的。GUI模型是MVC中的应用程序视图。谢谢。那真的很有帮助+对不起,Gilbert Le Blanc,我还有一个问题。我应该在哪里以及如何创建JFileChooser?我是否应该使用模型、视图和控制器在主类中创建它,将其设置为可见,作为对“打开文件”按钮上执行的操作的响应,然后将其设置为不可见?或者我应该每次在控制器中创建视图,作为对“打开文件”按钮上执行的操作的响应?您认为最好的方法是什么?您应该每次在控制器的ActionListener中创建视图,作为对“打开文件”按钮上执行的操作的响应。您还需要扩展JFileChooser。阅读这篇优秀的文章了解详细信息:您可以找到在MVC中使用JFileChooser的另一个示例。