如何组织Swing GUI应用程序?

时间:2011-06-07 18:23:56

标签: java swing user-interface architecture

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

看一本描述更大Swing应用程序开发的书也很高兴。我找到的只是关于设计指南的书籍,其中设计指的是应用程序的外观。其他Swing书籍(如O'Reilly)详细描述了所有挥杆组件,但有关大局的任何信息在哪里?

有没有关于摇摆gui的好例子,你会说“这就是你如何组织代码/文件夹/包装摇摆!”?

编辑:我发现了以下网站http://www.ibm.com/developerworks/java/tutorials/j-springswing/section7.html,它描述了创建GUI时spring的用法。这是一个相当古老的例子,它没有回答我的问题,但它是迈向正确方向的一步。它还提到了Spring RCP,但我不确定它是不是解决方案。

EDIT2:我仍然没有找到更好的答案。有没有人知道开源的理想结构Swing GUI的例子?有人知道一本描述它的书吗?如果不是Swing,那么也许对于GUI来说一般?

4 个答案:

答案 0 :(得分:12)

虽然它是 Groovy ,而不是 Java ,但我建议你看看Griffon,这是一个“ Grails for Swing < / EM>”。

它为您使用它构建的所有应用程序强制执行给定的结构(就目录和模式而言,特别是 MVC )。

我认为它可以为您提供一般的好主意,尽管您必须对Java进行一些改编。

此外,请注意,Griffon还支持使用Java构建应用程序,它也可能为此提供“原型”,因此您也可以检查它。

答案 1 :(得分:8)

您可以阅读A Swing Architecture Overview。但是,当我做大型Swing应用程序时,我不会像在进行Web开发时那样组织它们。我只是在功能部件中组织我的Swing应用程序。例如。如果应用程序有四个包含表单和表格的选项卡,我将组件从一个选项卡放在一个包中。然后我通常会得到表格和表格相互作用的AbstractTableModel的一些自定义实现。模型保留数据缓存并与数据库通信。

在我最新的Swing应用程序中,我使用Akka actors来简化线程。然后我在EDT线程上执行了所有Swing组件,并与一个自定义Actor的数据访问对象进行通信。然后我还有一些TimerTask将数据库中的数据与互联网上的服务同步,但它们从未在EDT上运行,它们只与DAO(我的演员)进行通信。

答案 2 :(得分:6)

Web开发会强制您使用某些源和资源布局。 Swing应用程序不是这种情况。在这里,您可以使用最适合您目标的布局。

如果使用某些IDE,您将获得更高的效率。 NetBeans是Swing的完美选择。 NB为您提供了如何存储课程的一些限制。如果您使用JUnit,则有一个“Source Packages”文件夹,其中包含Java Packages和相应JUnit测试类的“Test Packages”,我强烈建议您这样做。

如果你使用Hibernate,你必须坚持它的约定,构建一个whatever.entity和whatever.util以及配置XML文件需要在'default package'中。

这些软件包的任何进一步组织都取决于程序员。我使用运行整个节目的JFrame制作一个包。每个逻辑单元的包。有时我使用AbstractTableModel的包并将它们保持在一起,而另一个用于ComboBoxModels。没有必要制作更深层的结构。您可以为可用于按钮的图标设置单独的包,一个用于声音等.Netbeans为您的应用程序创建可运行的jar文件,其中包含所有必需的文件,包括所需的库jar。

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

enter image description here

书籍描述了较小的样本,并且更关注Java约定。

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

答案 3 :(得分:0)

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

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

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

我自己没试过,但我看到了一些好处。您可以在没有实际显示屏幕的情况下测试JUnit屏幕序列。只需创建窗格实例窗格并使用事件调用监听方法(鼠标单击等...)。

只是一个想法。