如何组织一个Swing GUI应用程序?

我已经写了几个使用Swing的GUI,并且我知道MVC,但是我从来没有find一个很好的方法来真正地组织我的代码。 我正在寻找的就像maven为每个新项目引入的文件夹结构。 另一个例子是rails,其中MVC是通过文件夹结构自动引入的。 Swing有类似的东西吗?

看到一本描述更大Swing应用程序开发的书也不错。 我所find的都是关于devise指南的书籍,其中devise是指应用程序的外观。 其他Swing书(如O'Reilly)详细描述了所有的摇摆组件,但是关于大图的信息在哪里?

有没有什么好的摇摆gui的例子,在那里你会说:“这就是你如何组织代码/文件夹/包的摆动!”?

编辑:我find了下面的网站http://www.ibm.com/developerworks/java/javascript/j-springswing/section7.html ,它描述了在创buildGUI时使用spring。 这是一个相当古老的例子,它不回答我的问题,但是这是一个正确的方向。 它也提到了Spring RCP,但我不确定它是否可以成为解决scheme。

编辑2:我仍然没有find更好的答案。 有没有人知道一个结构完美的Swing GUI是开源的例子? 有人知道一本书,它描述了吗? 如果不是Swing,那么也许对于GUI来说呢?

虽然它是Groovy ,而不是Java ,但我build议你看看Griffon ,它是一个“ Swils的Grails ”。

它执行一个给定的结构(就目录和模式而言,特别是MVC方面),以及与之一起构build的所有应用程序。

我认为它可以给你一个好的想法,尽pipe你将不得不对Java做一些改动。

另外请注意,Griffon也支持Java中的应用程序构build,也可能提供“原型”,所以你也可以检查。

你可以阅读一个Swing架构概述 。 但是,当我做更大的Swing应用程序时,我不会像在进行Web开发时那样组织它们。 我只是在function部分组织我的Swing应用程序。 例如,如果应用程序具有四个带有表格和表格的选项卡,我将一个选项卡中的组件放在一个包装中。 然后我通常最终得到一些表单和表格交互的AbstractTableModel自定义实现。 模型保存数据的caching并与数据库进行通信。

在我最新的Swing应用程序中,我使用Akka actors来简化线程。 然后,我把所有的Swing组件在EDT-thread上执行,并与一个自定义Actor的Data Access Object进行通信。 然后,我也有一些TimerTask将数据库中的数据与Internet上的服务同步,但他们从来没有在EDT上运行,他们只与DAO(我的Actor)进行通信。

Web开发迫使你去某些源和资源布局。 Swing应用程序并非如此。 在这里,您可以使用最适合您目标的布局。

如果你使用一些IDE,你会更有效率。 NetBeans是Swing的最佳select。 NB给你一些关于如何存储你的类的限制。 有一个“Source Packages”文件夹,其中包含Java包和一个“testing包”,如果您使用JUnit,则强烈build议您执行相应的JUnittesting类。

在使用Hibernate的情况下,你必须坚持它的约定,build立一个whatever.entity和whatever.util,configurationXML文件需要在'默认包'中。

任何进一步的这些包的组织都取决于程序员。 我使用运行整个演出的JFrame做一个包。 并为每个逻辑单元打包。 有时我使用AbstractTableModels的包,并将它们保留在一起,另一个用于ComboBoxModels。 没有必要做出更深层次的结构。 您可以为您的button使用一个单独的包,一个用于声音等.Netbeans为您的应用程序创build可运行jar文件,其中包括所需的所有文件包括所需的库文件。

这里有一个小例子。 除“th”之外的所有软件包名称都非常明显。 'th'是这个应用程序的名称,我有JFrame在那里托pipe应用程序。 这个应用程序使用iReport来生成报告。 这是“iReports”软件包的用途。

在这里输入图像说明

书籍描述较小的样本,更关心Java约定。

您可以尝试Apache Maven,并查看它们提供的应用程序原型的体系结构。

不幸的是(幸运的是,这取决于你如何看待它),开发可用于多种数据结构的通用窗格并不容易。 M通常与V紧密相关,V通常包含一些C.

我倾向于将V窗格和相应的M结构放在同一个包中。 您还需要一些中央控制显示器来显示每个单独的窗格。 C由中央控制显示器和窗格本身共享。

现在,如果你的项目需要更多的结构,你可以用Struts 2框架来强制移动所有的C,并且有一些窗格(V)表示下一个要显示的M / V。 Struts最初是为Web应用程序开发的,但是Struts 2现在从HttpServlet中分离出来了。

我没有尝试过这个,但我看到一些好处。 您可以JUnittesting屏幕序列,而不需要实际显示屏幕。 只需创build窗格实例窗格,并调用事件的监听方法(鼠标点击等)。

只是一个想法。