【问题标题】:Java Class Architecture for swing GUI programming用于 Swing GUI 编程的 Java 类体系结构
【发布时间】:2011-01-12 04:51:12
【问题描述】:

我正在编写一个需要大量摆动 GUI 组件的应用程序。我在组织课程时遇到了很多麻烦。有没有一种方法来组织和整齐地布局类架构?

我发现我的构造函数令人困惑,它包含许多正在初始化的组件,然后是几个事件处理程序。

另外,我有很多匿名类和内部类,我的主类变得臃肿。但是,当我将内部类事件处理程序放在单独的文件中时,我无法访问我的主类的组件。是否有内部组织大型 swingGUI 应用程序的方法?

【问题讨论】:

    标签: java swing architecture


    【解决方案1】:

    Swing 在内部使用 MVC 模式组织。

    【讨论】:

      【解决方案2】:

      我会将内容拆分为 JPanel。

      获取一组相互关联的组件,并创建一个继承自 JPanel 的新类(在单独的文件中)。然后在您的 Main 类中,您只需导入该类并像任何其他 JPanel 一样使用它,除了它已经包含所有组件。 Main 类只需要将面板添加到布局中。

      在 JPanel 类中,您可以仅在该类中进行所有初始化、配置和事件侦听,这样您就不会弄乱您的 Main 类。

      【讨论】:

      • 我假设我会将每个自定义 JPanel 组件公开,但实际自定义 JPanel 在主类中是私有的?
      • 不,你在类中扩展 JPanel。所以类是一个JPanel。您只需执行 MyCustomPanel mcp = new MyCustomPanel();并添加(mcp);类中不会有显式的 JPanel 对象。 'this' 对象将是一个隐式的 JPanel 对象。
      • 但是,如果我想访问 myCustomPanel 中的组件,我需要公开它们的组件吗?
      【解决方案3】:

      如果您的大量 GUI 组件排列在单独的面板中,然后将面板布置在框架中,您可以将这些内部面板的创建方法化,以使代码更易于消化:

      public MyApp() {
          JPanel mainPanel = new JPanel(new BorderLayout());
          JPanel north = createNorthPanel();
          mainPanel.add(north, BorderLayout.NORTH);
      
          JPanel south = createSouthPanel();
          mainPanel.add(south, BorderLayout.SOUTH);
      
          JPanel east = createEastPanel();
          mainPanel.add(east, BorderLayout.EAST);
      
          JPanel west = createWestPanel();
          mainPanel.add(west, BorderLayout.WEST);
      
          myFrame.setContentPane(mainPanel);
      }
      

      【讨论】:

      • 我喜欢这个解决方案,并且绝对可以解决我臃肿的构造函数,但是它对整个课程没有帮助。
      • 这对于小程序来说是完美的。 +1
      【解决方案4】:

      在较大的摇摆项目中,我会像这样对应用程序进行分区:

      • 每个 GUI 元素都有一个类,如 JPanel、JDialog 等。

      • 为每个屏幕使用单独的包,尤其是在您必须实现自定义 TableModel 或其他复杂数据结构时

      • 不要使用匿名类和内部类,而是实现一个 ActionListener 并在其中检查 ActionEvent.getActionCommand()。

      【讨论】:

      • 这是最好的解决方案。但是,对于一个小型项目,这将是大量的额外工作。
      • @Mac- 你刚刚明白了为什么每个项目都没有一个解决方案。我喜欢借用爱因斯坦的话:“尽量简单,但不要简单”。如果构造函数中的所有内容都适用于您的小项目,请使用它。但是,如果您发现项目不再小并且事情变得笨拙,请开始使用一些设计模式来提供帮助。 akf 的解决方案是很好的第一步,stacker 的解决方案会更进一步。正如您所指出的,从一开始就使用 stacker 的解决方案的问题在于,它实际上使小型项目的情况变得更糟。
      【解决方案5】:

      这里是我过去用来减少摇摆班混乱的策略。

      1. 通用侦听器:创建一个 ActionListener,而不是围绕匿名 ActionListener 类进行拆分,该 ActionListener 将对象和方法的名称作为构造函数参数。当触发时,ActionListener 调用指定对象上的指定方法。增加了反射形式的复杂性,但会消耗数百行容易出错的样板代码。

      2. 关注点分离。为以下任务设置单独的 [Methods|Classes|Packages]:

        • 创建组件:您需要一个新的文本字段吗?不要直接调用new JTextField,让工厂为你创建。在创建方法中,您可以进行所有设置,例如首选大小、颜色、字体。结构化代码,删除重复并确保事物在整个应用程序中的行为方式相同。尤其是复杂的控件,如日期选择器

        • 将简单控件组装到属于一起的单元:标签 + 编辑控件 + 无效输入标记;按钮组

        • 将一堆这样的单元布局到一个 JPanel

        • 将 JDialog、JWindow、JFrame 或其他任何东西与 JPanel 连接在一起

        • 事件连接

      3. 考虑JGoodies Binding

      【讨论】:

        【解决方案6】:

        我可以看到 GUI 的单独方法/类。 . .我只是不确定整个单独的包是否值得麻烦,除非有大量的表格等。

        【讨论】:

          猜你喜欢
          • 2015-09-11
          • 2010-10-07
          • 2012-06-26
          • 2011-03-10
          • 2011-04-20
          • 1970-01-01
          • 2015-04-09
          相关资源
          最近更新 更多