小编典典

创建基于另一个但具有不同API的Swing组件

java

我想基于现有的Swing JComponent创建一个新的Swing
JComponent,但使用不同的API。换句话说,我不想扩展现有组件,因为我不想访问它的API。

这里有一个例子来阐明我的需求:

替换为JCheckBox显示两个按钮ON / OFF。这可以基于 预先配置的
JCommandButtonStrip此处提供一些信息),但要公开与完全相同的API
JCheckBoxJCommandButtonStrip不得更改其配置。

解决此类问题的最佳方法是什么?

说明:

有人指出,我写的关于API的内容还不清楚。

当然,JComponent有许多公共领域和方法可供每个子类使用。然后,的每个子类都JComponent可以添加自己的公共字段和方法。例如,AbstractButton添加isSelected()方法,而JCommandButtonStrip添加getButtonCount()方法。

所以,我的意思是:我想创建一个基于现有JComponent子类的新子类。除了那些方法之外,我不想被我的班级公开。然后,我想向中添加一些公共方法。MyJComponent``ExistingJComponent``ExistingJComponent``JComponent``MyJComponent``MyJComponent

请注意,我不是在寻找JCommandButtonStrip/ JCheckBox示例的替代方法。我对解决这种问题的一般方法感兴趣。


阅读 229

收藏
2020-11-26

共1个答案

小编典典

您可以创建一个扩展JComponent的新类,然后在构造函数内部插入一个复选框。

public class MyCoolCheckbox extends JComponent{
    private JCheckBox checkbox;
    public MyCoolCheckbox(String label) {
        checkbox= new JCheckBox(label);
        this.setLayout(new BorderLayout());
        this.add(checkbox, BorderLayout.CENTER);
    }
}

这显然是不完整的,您可能需要将某些方法委托给孩子。可能会变得凌乱。如果您按alt-
ins键(默认情况下)然后进行委派,然后选择复选框成员并选择要委派的条目,则像IntelliJ IDEA这样的IDE将为您生成所有这些信息。例如:

public void setForeground(Color fg) {
    checkbox.setForeground(fg);
}

public void setBackground(Color bg) {
    checkbox.setBackground(bg);
}
public Color getForeground() {
    return checkbox.getForeground();
}

public Color getBackground() {
    return checkbox.getBackground();
}

请记住,由于子级位于Swing组件树中,因此其他代码也可以访问这些子级,即使它们被标记为私有。

((JCheckBox)myCoolCheckbox.getComponents()[0]).setSelected(true);
2020-11-26