JButton重写setEnabled方法问题的Java子类

JButton重写setEnabled方法问题的Java子类,java,swing,inheritance,jbutton,method-hiding,Java,Swing,Inheritance,Jbutton,Method Hiding,我有一个名为ImageButton的自定义按钮类,它扩展了JButton。在它里面,我有一个setEnabled方法,我希望被调用,而不是JButton的setEnabled方法 我的代码如下。在我的另一个类中,我创建了ImageButton的一个新实例,但是当我尝试使用setEnabled方法时,它直接转到JButton的setEnabled方法。甚至在我运行代码之前,我的IDE就告诉我永远不会使用ImageButton的setEnabled方法。如果我将方法更改为“SetOn”,则效果良好。

我有一个名为ImageButton的自定义按钮类,它扩展了JButton。在它里面,我有一个setEnabled方法,我希望被调用,而不是JButton的setEnabled方法

我的代码如下。在我的另一个类中,我创建了ImageButton的一个新实例,但是当我尝试使用setEnabled方法时,它直接转到JButton的setEnabled方法。甚至在我运行代码之前,我的IDE就告诉我永远不会使用ImageButton的setEnabled方法。如果我将方法更改为“SetOn”,则效果良好。那么为什么我不能使用与超级类相同的名称呢?我以为它应该隐藏超类方法,如果它是相同的名字

public class ImageButton extends JButton{

    public ImageButton(ImageIcon icon){
        setSize(icon.getImage().getWidth(null),icon.getImage().getHeight(null));
        setIcon(icon);
        setMargin(new Insets(0,0,0,0));
        setIconTextGap(0);
        setBorderPainted(true);
        setBackground(Color.black);
        setText(null);
    }

    public void setEnabled(Boolean b){
        if (b){
            setBackground(Color.black);
        } else {
            setBackground(Color.gray);
        }
        super.setEnabled(b);
    }
}
你需要改变

public void setEnabled(Boolean b){

(使用instead而不是
boolean
就是重载该方法,而不是重写它。)


我鼓励您始终使用
@override
注释打算重写另一个方法的方法。如果您在本例中这样做,编译器会抱怨并说类似的话

类型为
ImageButton
的方法
setEnabled(Boolean)
必须重写或实现超类型方法


尝试不使用布尔值中的大写字母:布尔值和布尔值之间存在差异,因此签名不同:

public void setEnabled(boolean b)
带有大写字母的布尔值是一个类。 布尔是语言的一种基本类型。
(整数对整数、双精度对双精度等也是如此)

ahh谢谢你的帮助。出于好奇,当我将B大写时会发生什么?如果我只是将方法的名称更改为唯一的名称,为什么它与大写B一起工作?对于每个原语(
boolean
int
float
等等),都有一个对象计数器部分(
boolean
Integer
float
等等). 在某些情况下,它们通过自动装箱进行类似处理。然而,当重写方法时,它们被视为完全不同的类型。我的IDE给出了一个错误,上面写着“方法不会覆盖超类中的方法”。我当时不明白这一点。我建议你删除它,然后将对象更改为类。旁注:你可以做
setBackground(b?Color.black:Color.gray)也是。啊,是的,这是个好主意。出于好奇,从资源的角度来看,这种语法更有效还是仅仅是一种风格?
public void setEnabled(boolean b)