我想向您询问有关在 Swing 中创建 GUI 的一个技术问题。假设我有一个 JFrame
或 JDialog
(没关系),其内容组织在许多 JPanels
中(设置、操作、显示数据、图表等...) - 全部在一个框架中。
例如:here
我现在正在做的是将所有组件定义在一个文件中(将其命名为 MainPanel.java
)并将它们组织在 JPanels
中。 A 有单独的方法来组织每个面板
private void organizePanels() {
pnlSettings = createPnlSettings();
pnlActions = createPnlActions();
pnlChart = createPnlChart();
// ...
}
每个方法负责设置 JPanel
的布局、组织其中的组件等。当我有 3-4 个不复杂的面板时,它就有意义了(我的意思是非常可读)。但是,如果我创建一个更复杂的结构,它就会开始成为一个小的维护噩梦(或者是一个很好的起点)。
这就是为什么我想使用这种方法:
- 为每个 JPanel
创建一个单独的类
- 每个类都应该有一个对其内部组件的访问器(单击 JButton
A 中的 JPanel
应该会刷新其他 JPanel
中的 JCombo )。
- 面板之间的通信应由 MainPanel 以某种方式提供。
因此,在 mainPanel 中,我将仅引用 JPanel,而不引用其中的组件。访问特定数据会有点长( pnlActions.getSaveButton.setEnabled(true)
而不是 btnSave.setEnabled(true)
,但这可能是一个自然的结果。我还可以将 JPanel 中的所有组件公开。
您认为这种方法正确吗?您认为我应该一直使用第二种方法,还是我的第一种方法适合不太复杂的结构?
你有什么经验?
最佳答案
就像 GUI 应用程序设计中的许多事情一样,哪种方式最好是一个权衡问题,最终取决于应用程序本身。没有适用于许多应用程序的正确答案。
你的方法会起作用,并且在某些情况下可能是最好的。然而,它确实将 GUI 面板的组织知识传播到多个类中,这可能会使维护变得比实际需要的更加困难。如果您以后出于某种原因想要将某些按钮或按钮组移动到另一个面板,那么数据的访问会发生变化,这意味着您必须在访问数据的任何位置以及按钮所在的位置更改代码。
您还可以设计一个只保存面板数据的类,确保其中任何地方都没有 UI 依赖项。 Swing 或任何其他 UI 包都不应该出现在导入列表中的任何位置,并且如果您想在 SWT 或 Spring MVC 或 Windows 应用程序中使用此类,它应该能够在其中不变地工作。然后向每个面板提供对该类的单例实例的引用,并让它们根据需要获取和设置值。这允许您以您喜欢的任何方式更改 UI,而无需更改数据的访问方式。
此方法假设给定框架/对话框的“数据模型”并没有复杂到处理它的类本身过于复杂。对于如此复杂的框架,您可能会考虑将整体模型分为多个部分,因为模型的不同部分只需要从 UI 的某些部分进行访问,并在这些部分之间划分访问权限。
关于Java Swing JFrame 中的许多 JPanel - getter 还是全合一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19344213/