【问题标题】:Swing desktop app - how to organise my codeSwing 桌面应用程序 - 如何组织我的代码
【发布时间】:2012-10-08 17:12:54
【问题描述】:

我们将在下一个项目中使用 Swing,这将是一个轻量级桌面应用程序。

我一直在阅读 Oracle 网站上的 Swing 教程并开始掌握它。

有人告诉我,我需要在一个 JFrame 中工作并切换 JPanels,而不是切换 JFrame

我的问题如下。

我可以在设计模式(WYSIWYG 编辑器)中创建 JPanel 设计(或其模板)并调用 jframe.setContentPane(nameOfJPanel) 还是以编程方式在代码中进行?

其次,我如何构建我的代码...如果我动态添加新的 JPanel 并将它们的事件绑定到事件处理程序...我所有的逻辑和代码都将在一个具有数十种方法的巨大类中。我只是不知道如何继续,我在互联网上找不到一个包含多个(比方说 6 个以上)面板的示例。

【问题讨论】:

    标签: java swing frameworks


    【解决方案1】:

    JFrame 将是您应用的主窗口,而面板将是构成它的砖块。

    您应该在自己的类中创建每个面板,并且可以按包中的功能排列它们。您将拥有用于保存应用程序逻辑部分内容的面板和包含真实内容的面板。 逻辑面板可以是主视图和菜单栏。应用程序面板可以是表单、菜单、画布……

    您必须将应用程序面板放在逻辑面板内,并根据用户的操作更改逻辑的内容。

    您应该研究布局是如何工作的,以便在 JFrame 内组合视图并在面板内布局组件。

    例如,在定义应用程序的主要区域时,BorderLayout 是经典的: - 顶部的菜单和工具栏 - 左侧的浏览器 - 底部的状态栏 - 中心的主面板

    您可以使用所见即所得的编辑器,但要避免在同一个类中进行所有设计。否则你将有一个可怕的巨大的类。在单独的类中创建面板并在主视图中组合它们。
    您可以使用空面板作为占位符来帮助您创建应用程序的结构。

    您必须将您的域数据绑定到视图,以免将两层混在一起。 绑定意味着您将编写一种从 java bean 到表单的方法,反之亦然。 基本绑定是手写的,但存在一些工具可以做到这一点。 如果是小程序,最好全部手写。

    构建 Swing 应用程序可能非常棘手(您必须了解事件调度线程、布局管理、事件管理、小部件(标签很简单,但 JTable 处理起来可能非常复杂);

    我建议在开始项目之前找一本关于该主题的书,并找到一些开源的 Swing 应用程序来研究它的结构。

    【讨论】:

      【解决方案2】:

      所见即所得或不所见即所得

      这是一个值得商榷的问题。

      我鼓励我的所有初级开发人员开始手动编写 UI,因为它教给他们有关如何使用布局管理器以及如何处理复合布局的重要基础知识。

      这往往需要更长的时间,因为您需要在每次更改时验证布局。

      我个人使用 Netbeans 中的表单编辑器完成大部分日常工作,但会手动调整 UI

      结构

      考虑责任边界、重用和减少策略。

      您不想要的是什么都能做的大型大师班。这将很难维护和更新(我每天都生活在这种恐惧中)。

      相反,确定不同的责任领域,并使用 getter 和 setter 或模型在应用程序中移动数据。解耦代码越多,更新和修改就越容易。

      尽可能识别类似的工作并将其建模为接口和抽象类。基本上,无论您何时开始考虑应对代码,都可能很好地表明您的设计已关闭,您应该考虑实现抽象类以覆盖重叠。

      利用Action API 复制常用概念(复制和粘贴就是一个例子。您可能需要菜单项、可能的工具栏项甚至弹出项,这些都可以由同一个@处理987654322@类)。

      从视图中分离数据。正如我之前所说,利用模型。数据不应该关心它是如何收集或修改的,只要它可以。同样,视图不应该关心数据是如何管理的,只关心它是什么。

      如果可能,请在应用程序的不同区域之间定义接口。通过这种方式,您可以进一步解耦应用程序,并且没有任何部分依赖于任何一种实现(你好,我的世界:P)

      不要试图简单地挖掘组件层次结构来访问该字段,如果您需要更改代码,那将是一场噩梦!!

      【讨论】:

        【解决方案3】:

        这就是我组织代码的方式:

        class Panel1 extends JPanel{
           //code for panel1 and its Components
        }
        
        class Panel2 extends JPanel{
           //code for panel2 and its components
        }
        // and it follows. 
        class ApplicationFrame extends JFrame{
            /// LOGIC to switch between panels
        }
        
        class Main{
          //contains main() function
        }
        

        任何手工制作的 GUI 代码都比计算机生成的 WYSIWYG -APP 代码更好。

        【讨论】:

        • 您是否有机会将 applicationFrame 作为参数发送给 JPanel,以便您可以执行 frame.addComponent(panel); ??
        • 不。我一一实例化 JPanel,然后根据需要切换到它们。我不会将 applicationFrame 对象作为参数发送给 JPanel。
        猜你喜欢
        • 2011-11-21
        • 1970-01-01
        • 2011-12-10
        • 2013-05-17
        • 1970-01-01
        • 2013-06-01
        • 2010-10-01
        • 1970-01-01
        • 2017-03-30
        相关资源
        最近更新 更多