我想在我的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();
}
}
答案 0 :(得分:2)
在UIComponent中定义一个方法
public JComponent getRealComponent();
然后UIPanel和UIButton重写该方法并相应地返回JPanel和JButton。
方法应该是这样的
public void addUIComponent(UIComponent component) {
getRealComponent().add(component.getRealComponent());
}
答案 1 :(得分:1)
我为我们使用的MVP架构做了类似的事情。规则是在UI中没有应用程序逻辑,并且在Presenters中没有对Swing组件的引用。我们通过以下方式完成了:
创建Swing GUI实现的接口。演示者掌握了此界面,并与UI进行了互动。
使用充当每个字段的键的枚举(或字符串常量或其他)。 UI将使用指定的密钥注册每个组件,然后Presenter将使用这些字段键对UI进行操作。
Presenter中的代码如下所示:
ui.setEditable(AddressBook.NAME, false);
ui.setValue(AddressBook.NAME, "John Doe");
UI将接收这些事件,并使NAME字段的JTextField为只读,并使用给定文本填充。
基于您的问题,您想要将JButtons动态添加到UI吗?我们通常不这样做。在我们的场景中,UI界面的Swing实现者已经创建并注册了所有组件。
但是,如果这是真正需要的,我想我需要一个在UI上看起来像这样的方法(基于地址簿示例):
ui.addCommandButton(AddressBook.SOME_COMMAND, "Button Text");
或者,如果您没有密钥并希望UI动态生成新字段,可能是这样的:
Object key = ui.addCommandButton("Button Text");