Java 包装UI组件的模式

Java 包装UI组件的模式,java,swing,design-patterns,user-interface,wrapper,Java,Swing,Design Patterns,User Interface,Wrapper,我想在Java应用程序中包装UI组件,以使生产代码独立于具体的UI库。我现在有一个问题,如果我想在另一个组件上添加组件,因为包装器类不知道具体的UI元素 如何在不显示底层UI库的情况下处理元素的排序? public abstract class UIComponent { } public class UIPanel extends UIComponent { private JPanel jpanel; public UIPanel() { this.jp

我想在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();
    }
}

在UIComponent中定义一个方法

public JComponent getRealComponent();
然后UIPanel和UIButton重写该方法并相应地返回JPanel和JButton

方法应该是这样的

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

在UIComponent中定义一个方法

public JComponent getRealComponent();
然后UIPanel和UIButton重写该方法并相应地返回JPanel和JButton

方法应该是这样的

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

在UIComponent中定义一个方法

public JComponent getRealComponent();
然后UIPanel和UIButton重写该方法并相应地返回JPanel和JButton

方法应该是这样的

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

在UIComponent中定义一个方法

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将接收这些事件,并使名称字段的JTextField为只读,并用给定文本填充

那么,根据您的问题,您想将JButtons动态添加到UI中吗?我们通常不会那样做。在我们的场景中,UI界面的Swing实现者已经创建并注册了它的所有组件

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

或者,如果您没有密钥,希望UI动态生成一个新字段,可能类似于:

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

我为我们使用的MVP架构做了类似的事情。规则是UI中没有应用程序逻辑,演示者中没有对Swing组件的引用。我们通过以下方式实现了这一目标:

  • 创建Swing GUI实现的接口。演示者对这个界面有一个控制柄,它是如何与UI交互的

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

演示者中的代码如下所示:

ui.setEditable(AddressBook.NAME, false);
ui.setValue(AddressBook.NAME, "John Doe");
UI将接收这些事件,并使名称字段的JTextField为只读,并用给定文本填充

那么,根据您的问题,您想将JButtons动态添加到UI中吗?我们通常不会那样做。在我们的场景中,UI界面的Swing实现者已经创建并注册了它的所有组件

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

或者,如果您没有密钥,希望UI动态生成一个新字段,可能类似于:

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

我为我们使用的MVP架构做了类似的事情。规则是UI中没有应用程序逻辑,演示者中没有对Swing组件的引用。我们通过以下方式实现了这一目标:

  • 创建Swing GUI实现的接口。演示者对这个界面有一个控制柄,它是如何与UI交互的

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

演示者中的代码如下所示:

ui.setEditable(AddressBook.NAME, false);
ui.setValue(AddressBook.NAME, "John Doe");
UI将接收这些事件,并使名称字段的JTextField为只读,并用给定文本填充

那么,根据您的问题,您想将JButtons动态添加到UI中吗?我们通常不会那样做。在我们的场景中,UI界面的Swing实现者已经创建并注册了它的所有组件

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

或者,如果您没有密钥,希望UI动态生成一个新字段,可能类似于:

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

我为我们使用的MVP架构做了类似的事情。规则是UI中没有应用程序逻辑,演示者中没有对Swing组件的引用。我们通过以下方式实现了这一目标:

  • 创建Swing GUI实现的接口。演示者对这个界面有一个控制柄,它是如何与UI交互的

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

演示者中的代码如下所示:

ui.setEditable(AddressBook.NAME, false);
ui.setValue(AddressBook.NAME, "John Doe");
UI将接收这些事件,并使名称字段的JTextField为只读,并用给定文本填充

那么,根据您的问题,您想将JButtons动态添加到UI中吗?我们通常不会那样做。在我们的场景中,UI界面的Swing实现者已经创建并注册了它的所有组件

<