容器与组件与控件(通用UI库设计)

时间:2017-12-20 10:49:52

标签: java user-interface

我正在用Java开发一个用户界面框架。这不是一个非常严肃的问题,但我仍然在努力做到这一点。

我对容器有一个小设计问题。在我的设计中,我有Control,它是所有UI元素的基类。它有大小,位置和渲染方法等字段。

然后有Container可以容纳一组控件。例如,列表框包含多个控件。 ContainerControl的子类。它只是添加了访问子控件的方法,例如: Container.renderChildren()

这一切都很好,但这意味着Container需要保留2个列表。普通旧Control的一个列表和它所拥有的Container的一个列表。您无法将它们放入单个List<Control> childList;中,因为容器具有其他功能。他们需要与普通控制措施区别对待。

所以我决定引入Component,它持有一个控件或一个容器,并带有一个标志,说明它包含哪一个。然后每个Container只有一个组件列表,而Component负责抽象出Control和Container之间的差异。例如,有一个Component.renderChildren()调用适当的方法。

问题是它看起来不是很优雅。对于继承问题来说,感觉就像是一种解决方法。起初我只是使每个Control都具有类似容器的功能,因此所有控件都能够保存子控件。但我也不喜欢这样,因为一个控件不应该知道关于孩子的任何事情,它应该只是一个简单的UI元素。

我刷新了我对C#如何做到的知识。在C#组件中实际上是控件的子类,而不是相反。但我也不喜欢这样。

我为言辞不好且冗长的问题道歉。我并没有付出太多努力,因为这是一个相当小的问题,但如果你自己可能会感到困扰,那么有兴趣听取意见。

public class Control {
    public Dimensions dimensions;

    public void render() {
        // ...
    }
}

public class Container extends Control {
    protected ControlList childControls;
    protected ContainerList childContainers;

    public ControlList getRenderList() {
        // return all children (both controls and containers) 
        // ...
    }
}

public class Renderer {
    // container for main window that holds the 'tree' of all other controls
    protected Container rootContainer;

    public void render() {
        ControlList renderList = rootContainer.getRenderList();

        // do the render
        // ...
    }
}

0 个答案:

没有答案