0

我想问你关于在 Swing 中创建 GUI 的一个技术方面。假设我有一个JFrameJDialog(没关系)以许多JPanels(设置、操作、显示数据、图表等)组织的内容 - 全部在一个框架中。

例如:这里

我现在正在做的是在一个文件中定义所有组件(让它命名MainPanel.java)并将它们组织在JPanels. A 有一个单独的方法来组织每个面板

private void organizePanels() {
  pnlSettings = createPnlSettings();
  pnlActions = createPnlActions();
  pnlChart = createPnlChart();
  // ...
}

每个方法都负责设置JPanel的布局,组织其中的组件等。当我有 3-4 个不复杂的面板时,它是有意义的(我的意思是可读性很强)。但是,如果我创建一个更复杂的结构,它就会开始成为一个小的维护噩梦(或者是一个很好的起点)。

这就是我想使用这种方法的原因: - 为每个JPanel创建一个单独的类 - 每个类都应该有一个对其内部组件的访问器(单击AJButtonJPanel的 a 应该会影响刷新 other 中的 JCombo JPanel)。- 面板之间的通信应该由 MainPanel 以某种方式提供。

因此,在 mainPanel 中,我将只引用 JPanel 而不是其中的组件。访问特定数据会稍微长一点(pnlActions.getSaveButton.setEnabled(true)而不是,btnSave.setEnabled(true) 但这可能是自然的结果。我也可以公开 JPanel 中的所有组件。

你觉得这种方法正确吗?您是否认为我应该一直使用第二种方法,或者我的第一种方法适用于不太复杂的结构?

你有什么经验?

4

2 回答 2

1

就像 GUI 应用程序设计中的许多事情一样,哪种方式最好是最终取决于应用程序本身的权衡问题。没有适用于许多应用程序的正确答案。

你的方式会奏效,并且在某些情况下可能是最好的。然而,它确实将 GUI 面板的组织知识传播到多个类中,这可能会使维护变得比需要的更加困难。如果您稍后出于某种原因想要将一些按钮或按钮组移动到另一个面板,那么数据的访问会发生变化,这意味着您必须在访问数据的任何位置以及按钮所在的位置更改代码。

您还可以设计一个仅包含面板数据的类,确保其中任何地方都没有 UI 依赖项。Swing 或任何其他 UI 包都不应出现在导入列表中的任何位置,如果您想在 SWT 或 Spring MVC 或 Windows 应用程序中使用此类,它应该能够在此处不加改动地工作。然后为每个面板提供对此类的单例实例的引用,并让它们根据需要获取和设置值。这允许您以您喜欢的任何方式更改 UI,而无需更改访问数据的方式。

这个方法假设给定框架/对话框的这个“数据模型”并不复杂到处理它的类本身过于复杂。对于这样一个复杂的框架,您可能会考虑将整体模型划分为多个部分,因为模型的不同部分只需要从 UI 的某些部分访问,并在这些部分之间划分访问。

于 2013-10-13T12:45:55.107 回答
0

我想,你走对了。我什至会进一步介绍一个面板处理程序类(静态或非静态)。这样,您就可以清楚地将 GUI 组件(包括 JFrame 本身)与其内部管理分开。以某种方式通过面板处理程序中的公共方法注册面板。如果某个面板中发生了影响另一个面板的事情,您可以让面板按照您的计划联系处理程序。所有面板都有各自的界面,该界面决定了处理程序如何操作它们。这种概念设计对于更大的应用程序是非常可行的,因为处理程序总结了所有可能触发的交互,而不是“隐藏”在一堆面板类中某处的功能。

您甚至可以通过让所有面板停止它们共享的方法或变量来改进这个概念设计。这减少了一些代码更改的时间和精力。如果您想使用更多并发编程,处理程序类允许您为需要完成的所有事情创建查询。您只需让面板将作业添加到查询中,然后处理程序执行作业并随后将它们从查询中删除。

于 2013-10-13T11:50:22.277 回答