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

时间:2009-06-15 10:04:59

标签: java model-view-controller user-interface swing model

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

描述起来有点困难,但基本上我们的系统中有很多参考数据(即对应于DB中的查找表)。我们希望人们能够从一个屏幕上编辑它们。

因此,在理想世界中,我们想要的是左上角的组合框,其中包含参考数据的“类型”列表(因此每个对应于数据库中的一个表)。

然后,选择后,下面会填充数据列表,也会填充过滤器(或搜索框)。选择其中一个项目后,将激活右侧面板,以便编辑实际数据。

现在,问题在于:我们需要编辑的每种类型的数据都是不同的,因此它有不同的字段等。我们可以使用通用解决方案,但我并不是他们的粉丝 - 有很多不同的每个等的验证规则,即使对于不同的客户,也是管理的噩梦。

我们正在使用Presentation Model模式来实现GUI代码和模型之间的某种程度的分离,但我想不出一种干净的方式来做到这一点,这不会模糊责任线a位。

你有什么办法解决这样的问题?

[注意:对于长期问题道歉,希望这是可以理解的,如果有必要我可以重新发表意见]

2 个答案:

答案 0 :(得分:1)

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

所以你可以拥有类似的东西:

IWidget widget = UIFactory.createFor(myObject.getType())

可以在选择事件上调用,以创建正确的窗口小部件来编辑所选元素。

IWidget可以有以下方法:

validateData()
refreshData()
setDataElement(IDataElement element)

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

我使用这个与Eclipse扩展机制捆绑在一起的解决方案将新的UI元素插入到我的“基础”解决方案中,以获得可扩展的核心和高水平的重用。您可以通过手动或使用Spring将类型和小部件注入工厂来实现类似的功能。

答案 1 :(得分:0)

如果您不想沿着通用路径前进,可以让您的模型保持组合框项目的映射 - >用于CardLayout的面板名称。然后,您可以创建自定义面板以编辑每个参考数据类型。更改组合框选择后,您可以保存模型中的当前状态,请求当前选择的面板名称,准备下一个面板进行显示,然后让您的CardLayout显示它。