Java-подкласс JButton переопределил проблему метода setEnabled - PullRequest
4 голосов
/ 07 июня 2011

У меня есть собственный класс кнопок под названием ImageButton, который расширяет JButton. В нем у меня есть метод setEnabled, который я хочу вызывать, а не метод setEnabled JButton.

Мой код ниже. В моем другом классе я создаю новый экземпляр ImageButton, но когда я пытаюсь использовать метод setEnabled, он идет прямо в метод setEnabled JButton. Еще до того, как я запустил код, моя IDE сообщает мне, что метод setEnabled в ImageButton никогда не используется. Если я изменю метод на «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);
    }
}

Ответы [ 2 ]

8 голосов
/ 07 июня 2011

Вам нужно изменить

public void setEnabled(Boolean b){

на

public void setEnabled(boolean b){
                       ^

(При использовании Boolean вместо boolean вы перегружаетесь метод вместо переопределения it.)


Я рекомендую всегда аннотировать методы, предназначенные для переопределения другого метода, с помощью @Override.Если бы вы сделали это в этом случае, компилятор жаловался бы и сказал бы что-то вроде

Метод setEnabled(Boolean) типа ImageButton должен переопределить или реализовать метод супертипа.

2 голосов
/ 07 июня 2011

Попробуйте без заглавной буквы в Boolean: есть разница между Boolean и Boolean, поэтому подпись отличается:

public void setEnabled(boolean b)

Boolean с заглавной буквой является классом.логический тип является примитивным типом языка.(То же самое для int против Integer, double против Double и т. Д.)

...