Swing桌面应用程序 - 如何组织我的代码

3
我们将在下一个项目中使用Swing,这将是一个轻量级的桌面应用程序。
我一直在阅读Oracle网站上的Swing教程,并开始逐渐掌握它。
有人告诉我,我需要在一个JFrame内工作,并切换JPanels,而不是切换JFrame。
我的问题如下:
我可以在设计模式(所见即所得的编辑器)中创建JPanel设计(或其模板),并调用jframe.setContentPane(nameOfJPanel),还是要在代码中以编程方式完成?
其次,我该如何组织我的代码...如果我动态添加新的JPanels并将它们的事件绑定到事件处理程序...所有我的逻辑和代码都将在一个巨大的类中,有数十个方法。我不知道该怎么做,也找不到一个多于6个面板的示例。
3个回答

4

使用所见即所得编辑器还是手写UI

这是一个有争议的问题。

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

这通常需要更长时间,因为您需要验证每个更改后的布局。

我个人在大多数一般工作中都使用Netbeans中的表单编辑器,但会手动调整UI。

结构

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

你不想要一个做EVERYTHING的巨型主类。它将很难维护和更新(我每天都生活在这样的恐惧中)。

相反,确定明确的责任区域,并使用getter和setter或模型将数据移动到应用程序中。你的代码解耦程度越高,更新和修改就越容易。

识别相似的工作并将其建模为接口和抽象类。基本上,无论你从哪里开始考虑代码复制,都可能是你的设计出了问题,你应该考虑实现抽象类来覆盖重叠部分。

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

将数据与视图分离。如我之前所说,利用模型。数据不应关心如何收集或修改,只需知道它可以被收集或修改。同样,视图不应关心如何管理数据,只需知道它存在即可。

如果可能,请在应用程序的不同区域之间定义接口。这样,您可以进一步解耦应用程序,任何一个部分都不会依赖于任何一个实现(你好,我的世界:P)

不要试图简单地深入组件层次结构以访问该字段,否则如果您需要更改代码,它将产生噩梦!


3

JFrame将是您的应用程序的主窗口,而面板将是组成其结构的砖块。

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

您将不得不将应用程序面板放置在逻辑面板中,并根据用户操作更改逻辑内容。

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

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

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

您将必须将您的领域数据绑定到视图中,以避免混淆两个层。 绑定意味着您将编写一种方法,从Java Bean转到表单,反之亦然。 基本绑定是手写的,但某些工具可以执行此操作。 如果是小型应用程序,则最好手写所有内容。

构建Swing应用程序可能非常棘手(您将必须了解事件分派线程、布局管理、事件管理、小部件(标签很简单,但JTable可能非常难以处理);

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


2
这是我组织代码的方式:
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代码,都比计算机生成的所见即所得应用程序代码更好。

你不会把 applicationFrame 作为参数传递给 JPanel,这样你就可以使用 frame.addComponent(panel); 吗? - Dragan
不是的。我逐个实例化JPanel,然后根据需要切换它们。我不会将applicationFrame对象作为JPanel的参数发送。 - Aniket Inge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接