Вопрос

Я пытаюсь сделать графический интерфейс в 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() для объекта равенства.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top