JButton重写setEnabled方法问题的Java子类
我有一个名为ImageButton的自定义按钮类,它扩展了JButton。在它里面,我有一个setEnabled方法,我希望被调用,而不是JButton的setEnabled方法 我的代码如下。在我的另一个类中,我创建了ImageButton的一个新实例,但是当我尝试使用setEnabled方法时,它直接转到JButton的setEnabled方法。甚至在我运行代码之前,我的IDE就告诉我永远不会使用ImageButton的setEnabled方法。如果我将方法更改为“SetOn”,则效果良好。那么为什么我不能使用与超级类相同的名称呢?我以为它应该隐藏超类方法,如果它是相同的名字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”,则效果良好。
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)