我想基于现有的Swing JComponent创建一个新的Swing JComponent,但使用不同的API。换句话说,我不想扩展现有组件,因为我不想访问它的API。
这里有一个例子来阐明我的需求:
替换为JCheckBox显示两个按钮ON / OFF。这可以基于 预先配置的 JCommandButtonStrip(此处提供一些信息),但要公开与完全相同的API JCheckBox。JCommandButtonStrip不得更改其配置。
JCheckBox
JCommandButtonStrip
解决此类问题的最佳方法是什么?
说明:
有人指出,我写的关于API的内容还不清楚。
当然,JComponent有许多公共领域和方法可供每个子类使用。然后,的每个子类都JComponent可以添加自己的公共字段和方法。例如,AbstractButton添加isSelected()方法,而JCommandButtonStrip添加getButtonCount()方法。
JComponent
AbstractButton
isSelected()
getButtonCount()
所以,我的意思是:我想创建一个基于现有JComponent子类的新子类。除了那些方法之外,我不想被我的班级公开。然后,我想向中添加一些公共方法。MyJComponent``ExistingJComponent``ExistingJComponent``JComponent``MyJComponent``MyJComponent
MyJComponent``ExistingJComponent``ExistingJComponent``JComponent``MyJComponent``MyJComponent
请注意,我不是在寻找JCommandButtonStrip/ JCheckBox示例的替代方法。我对解决这种问题的一般方法感兴趣。
您可以创建一个扩展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);