【问题标题】:GUI: Changing panels based on value of combo boxGUI:根据组合框的值更改面板
【发布时间】:2010-11-02 23:28:19
【问题描述】:

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

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

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

然后,在选择时,下面填充数据列表,还填充过滤器(或搜索框)。 When one of these items is selected, the panel to the right is activated which will allow the actual data to be edited.

现在,问题来了:我们需要编辑的每种类型的数据都是不同的,所以它有不同的字段等。我们可以采用通用的解决方案,但我不是他们的粉丝 - 有很多不同的每个等的验证规则,甚至针对不同的客户端,管理起来将是一场噩梦。

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

你用什么方法解决了这样的问题?

[注意:抱歉问题太长了,希望可以理解,如有必要我可以重新措辞]

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    IWidget 可以有如下方法:

    validateData()
    refreshData()
    setDataElement(IDataElement element)
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        相关资源
        最近更新 更多