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

时间:2012-10-18 09:27:57

标签: java swing frameworks

我们将使用Swing作为我们的下一个项目,它将是一个轻量级的桌面应用程序。

我一直在阅读Oracle网站上的Swing教程,并开始了解它。

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

我向你提出的问题如下。

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

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

3 个答案:

答案 0 :(得分:4)

WYSIWYG或WYSIWYG

在最好的时候,这是一个值得商榷的问题。

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

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

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

结构

考虑责任的界限,重用和减少策略。

你不想要的是一些能做所有事情的巨大的大师班。维护和更新很困难(我每天都生活在这种恐怖中)。

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

识别工作并将其建模为接口和抽象类。基本上,只要你开始考虑应对代码,就可能很好地表明你的设计是关闭的,你应该考虑实现抽象类来覆盖重叠。

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

将数据与视图分开。正如我之前所说,利用模型。数据不应该关心它是如何被收集或修改的,只能是它可以。同样,该视图不应该关心数据的管理方式,只关注它。

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

不要试图通过挖掘组件层次结构来获取对该字段的访问权限,如果您需要更改代码,它将产生噩梦!!

答案 1 :(得分:3)

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

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

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

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

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

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

您必须将域数据绑定到视图,以便不混合两个图层。 绑定意味着你将编写一种从java bean到表单的方法,反之亦然。 基本绑定是手写的,但有一些工具可以做到这一点。 如果它是一个小应用程序,那么你可以更好地手写所有东西。

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

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

答案 2 :(得分: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
}

任何HAND-CRAFTED GUI代码都优于计算机生成的WYSIWYG -APP代码。