GUI в Java, частные занятия для слушателя не работает
-
02-10-2019 - |
Вопрос
Я пытаюсь сделать графический интерфейс в Java, используя что-то вдоль этих линий:
public class GUIApp
{
DrawingPanel dp;
buttonPanel bp;
ova = Oval;
public GUIApp()
{
JFrame win = new JFrame("Drawing App");
dp = new DrawingPanel();
bp = new buttonPanel(this);
//Settings for panels and frame
ova = new Oval(100,100,100,100);
}
public void setOval(int c){
//Change color of oval
}
}
Тогда в моем классе ButtonPanel у меня есть это:
public class ButtonPanel extends JPanel
{
private JButton btnRed, btnGreen, btnBlue;
public ButtonPanel(GUIApp d)
{
ButtonListener listener = new ButtonListener();
btnRed = new JButton("Red");
btnGreen = new JButton("Green");
btnBlue = new JButton("Blue");
btnRed.addActionListener(listener);
btnGreen.addActionListener(listener);
btnBlue.addActionListener(listener);
setBackground(Color.lightGray);
GridLayout grid = new GridLayout(3,1);
add(btnRed,grid);
add(btnGreen,grid);
add(btnBlue,grid);
}
private class ButtonListener implements ActionListener{
public void clickButton(ActionEvent event) {
Object location = event.getSource();
if (location == btnRed){
d.setOval(1);
}
else if(location == btnGreen){
d.setOval(2);
}
else if(location == btnBlue){
d.setOval(3);
}
}
}
}
Но NetBeans дает ошибку для класса Inner ButtonListener, и я не знаю почему. Я также не знаю, как правильно позвонить в сепарацию из этого класса в класс GuiaPP. Что я делаю не так?
Решение
Проблема в том, что когда вы реализуете 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()
для объекта равенства.