gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:14:11 24 4
gpt4 key购买 nike

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

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

JCheckBox 的替换,显示两个按钮开/关。这可能基于预配置 JCommandButtonStrip(一些信息 here )但公开了与 JCheckBox 完全相同的 API。不得更改 JCommandButtonStrip 的配置。

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

说明:

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

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

所以,我的意思是:我想创建一个新的 JComponent 子类 MyJComponent,它基于现有的 ExistingJComponent。我不希望 ExistingJComponent 的公共(public)方法(JComponent 的公共(public)方法除外)被我的类 MyJComponent 公开。然后我想向 MyJComponent 添加一些公共(public)方法。

请注意,我不是在寻找 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);
}
}

这显然是不完整的,您可能需要将某些方法委托(delegate)给 child 。它可能会变得困惑。如果您点击 alt-ins(默认情况下)然后委托(delegate),IntelliJ IDEA 等 IDE 将为您生成所有这些,然后选择复选框成员并选择您要委托(delegate)的条目。例如:

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 组件树中,所以即使它们被标记为私有(private),其他代码也可以访问这些子组件。

((JCheckBox)myCoolCheckbox.getComponents()[0]).setSelected(true);

关于java - 基于另一个但具有不同 API 的 Swing 组件创建一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22641561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com