Java GUI:根据组合框的值更改面板

Java GUI:根据组合框的值更改面板,java,model-view-controller,user-interface,swing,model,Java,Model View Controller,User Interface,Swing,Model,我有一个关于GUI设计的问题,特别是关于JavaSwing和在表示和模型之间创建清晰的分离 这有点难以描述,但本质上我们的系统中有很多参考数据(即,这些数据对应于数据库中的查找表)。我们希望人们能够在一个屏幕上编辑所有内容 因此,在理想的情况下,我们希望在左上角有一个组合框,其中包含参考数据的“类型”列表(因此每个类型对应于数据库中的一个表) 然后,选中后,将在下面填充一个数据列表,以及一个过滤器(或搜索框)。当选择其中一项时,右侧的面板将被激活,从而允许编辑实际数据 现在,问题来了:我们需要编

我有一个关于GUI设计的问题,特别是关于JavaSwing和在表示和模型之间创建清晰的分离

这有点难以描述,但本质上我们的系统中有很多参考数据(即,这些数据对应于数据库中的查找表)。我们希望人们能够在一个屏幕上编辑所有内容

因此,在理想的情况下,我们希望在左上角有一个组合框,其中包含参考数据的“类型”列表(因此每个类型对应于数据库中的一个表)

然后,选中后,将在下面填充一个数据列表,以及一个过滤器(或搜索框)。当选择其中一项时,右侧的面板将被激活,从而允许编辑实际数据

现在,问题来了:我们需要编辑的每种类型的数据都是不同的,因此它有不同的字段等。我们可以使用通用解决方案,但我并不真正喜欢这些解决方案-每个etc都有许多不同的验证规则,即使对于不同的客户端,这将是一场噩梦

我们正在使用该模式来实现GUI代码和模型之间的某种程度的分离,但是我想不出一种干净的方法来做到这一点,它不会以某种方式模糊职责线

你是如何解决这类问题的

[注意:对于这个冗长的问题,我深表歉意,希望您能理解,如果需要,我可以重新措辞]

您可以使用为所选元素创建UI小部件。您还可以使用它根据类型创建验证规则对象。这会给你一些你想要的灵活性

因此,您可以使用类似于:

IWidget widget = UIFactory.createFor(myObject.getType())
可以在选择事件上调用,以创建用于编辑所选元素的正确小部件

IWidget可以有如下方法:

validateData()
refreshData()
setDataElement(IDataElement element)
这将允许您一般地处理所有UI小部件,但对于每个元素类型仍然有一个特殊的UI小部件。我假设您从表中选择的元素都实现了某个IDataElement接口,该接口包含getType()方法


我将此解决方案与Eclipse扩展机制结合使用,将新的UI元素插入到我的“基本”解决方案中,以获得可扩展的核心和高级别的重用。您可以通过手动或使用Spring将类型和小部件注入工厂来实现类似的功能。

如果您不想走通用路径,您可以让您的模型保存combobox item->panel name的映射,以便与。然后,您可以创建自定义面板来编辑每个引用数据类型。更改组合框选择后,您可以在模型中保存当前状态,请求当前选择的面板名称,准备显示下一个面板,然后让CardLayout显示它