如何在Java的MVC架构中集成JMenuBar?

如何在Java的MVC架构中集成JMenuBar?,java,model-view-controller,swing,Java,Model View Controller,Swing,我正在使用本教程使用MVC架构构建一个应用程序:。但我不确定应该如何或在何处放置代码来构建并在其中添加JMenuBar的actionListener 此外,Cay Horstmann的《面向对象的设计与模式》一书说,“控制器可能会处理来自窗口系统的鼠标和键盘事件,或者它可能包含按钮和菜单等用户界面元素。”我是否应该遵循这一建议?如果是,我应该如何实现它?如何将其添加到我的主类中的JFrame中?我总是按照以下方式创建菜单栏 class MyMenuBar extends JMenuBar {

我正在使用本教程使用MVC架构构建一个应用程序:。但我不确定应该如何或在何处放置代码来构建并在其中添加JMenuBar的actionListener


此外,Cay Horstmann的《面向对象的设计与模式》一书说,“控制器可能会处理来自窗口系统的鼠标和键盘事件,或者它可能包含按钮和菜单等用户界面元素。”我是否应该遵循这一建议?如果是,我应该如何实现它?如何将其添加到我的主类中的JFrame中?

我总是按照以下方式创建菜单栏

class MyMenuBar extends JMenuBar {
   add(new FileItem())
}

class FileItem extends MenuItem {
    addMenuItem(new ExitAction())
}

class ExitAction extends AbstractAction {
    //define the action, tooltip and name of here
}
然后在主框架中添加菜单栏 JFrame-myframe

myFrame.setMenuBar(new MyMenuBar())
有些语法可能是错误的,很久没有编写菜单栏了。您可以通过使用返回操作的工厂类来进一步扩展它,以便它们可以重用,或者使用一些DI框架来做相同的事情,如中所建议的,这是一种方便的封装方法。此外,“可用于将功能和状态与组件分离。”


附录:在这个非常简单的例子中,模型是一个表示文件系统中目录的
文件,视图是一个侦听
actionPerformed()
JLabel
。提供的封装确保每个菜单项和工具栏按钮产生相同的结果。这种方法是Swing的象征。

不是答案,但我更建议您看看基于PM的体系结构,而不是MVC。Karsten Lentzsch对此有很好的介绍(很抱歉,我现在没有链接),还有开源的JGoodies绑定库来帮助实现它。Tank you@jfpoilpret,我不知道这个架构,我会去看看。@mKorbel:谢谢!这种便利性令人信服,但我仍然需要解决架构方面的问题。