Проблема в том, что при реализации ActionListener
вы должны определить метод actionPerformed(ActionEvent e)
;Вы не сделали этого в вашем ButtonListener
классе.Вы не можете присвоить методу имя, которое хотите (как вы сделали с clickButton
), поэтому вы должны просто переименовать ваш clickButton
метод в actionPerformed
(и продолжить и добавить аннотацию @Override
тоже),
Теперь, чтобы вызвать d.setOval
из своего внутреннего класса, d
должен находиться в области видимости при вызове метода actionPerformed
.Есть несколько способов добиться этого: вы можете сделать d
переменной-членом вашего класса, или вы можете определить свой ButtonListener
как анонимный класс.
Например, если вы сохранили d
в качестве переменной-члена ваш код будет выглядеть следующим образом:
public class ButtonPanel {
private GUIApp d;
public ButtonPanel(GUIApp d) {
this.d = d;
// The rest of your code here...
}
}
Или вы можете использовать анонимный класс, например:
public ButtonPanel(GUIApp d) {
ActionListener listener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent event) {
Object location = event.getSource();
if (btnRed.equals(location)) {
d.setOval(1);
} else if (btnGreen.equals(location)) {
d.setOval(2);
} else if (btnBlue.equals(location)) {
d.setOval(3);
}
}
};
// The rest of your constructor code here ...
}
Примечание: Примечаниекак я также изменил использование ==
на equals()
для равенства объектов.