包装UI组件的模式



我想在我的Java应用程序中包装UI组件,以保持我的生产代码独立于具体的UI库。我现在有一个问题,如果我想在另一个上添加组件,因为包装器类不知道具体的UI元素。

如何处理元素的排序而不暴露底层UI库?

public abstract class UIComponent {
}
public class UIPanel extends UIComponent {
    private JPanel jpanel;
    public UIPanel() {
        this.jpanel = new JPanel();
    }
    public void addUIComponent(UIComponent component) {
        // how can I add the concrete jbutton from a UIButton
        // to the concrete jpanel of this UIPanel?  
    }
}
public class UIButton extends UIComponent {
    private JButton jbutton;
    public UIButton() {
        this.jbutton = new JButton();
    }
}

在uiccomponent中定义一个方法

public JComponent getRealComponent();

然后UIPanel和UIButton重写方法并相应地返回JPanel和JButton。

方法应该是这样的

public void addUIComponent(UIComponent component) {
  getRealComponent().add(component.getRealComponent());
}

我为我们使用的MVP架构做了类似的事情。规则是在UI中没有应用程序逻辑,并且在呈现程序中没有对Swing组件的引用。我们通过:

  • 创建Swing GUI实现的接口。演示者有这个接口的句柄,它是如何与UI交互的。

  • 使用枚举(或字符串常量,或其他)作为每个字段的键。UI将用指定的键注册每个组件,然后演示者将使用这些字段键对UI进行操作。

演示器中的代码看起来像这样:

ui.setEditable(AddressBook.NAME, false);
ui.setValue(AddressBook.NAME, "John Doe");

UI将接收这些事件,并使NAME字段的JTextField为只读,用给定的文本填充。

根据你的问题,你想动态地向UI添加JButtons吗?我们通常不会那样做。在我们的场景中,UI接口的Swing实现者应该已经创建并注册了它的所有组件。

然而,如果这是真正需要的,我想我需要一个在UI上看起来像这样的方法(基于一个地址本示例):

ui.addCommandButton(AddressBook.SOME_COMMAND, "Button Text");

或者,如果你没有键,希望UI动态生成一个新字段,也许像这样:

Object key = ui.addCommandButton("Button Text");

相关内容

  • 没有找到相关文章

最新更新