Pregunta

Estoy tratando de hacer una interfaz gráfica de usuario en Java, usando algo como lo siguiente:

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
      }
  }

A continuación, en mi clase buttonPanel tengo esto:

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);
        }
        }

}
}

Pero netbeans da un error de la clase buttonListener interno, y no sé por qué. Asimismo, no sé cómo llamar correctamente el setOval desde dentro de esa clase para la clase GUIApp. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

El problema es que cuando se implementa ActionListener debe definir el método actionPerformed(ActionEvent e) ; usted no ha hecho eso en su clase ButtonListener. No se puede nombrar el método cualquier cosa que desee (como se ha hecho con clickButton), por lo que sólo debe cambiar el nombre del método clickButton a actionPerformed (y seguir adelante y añadir una anotación @Override también).

Ahora con el fin de llamar d.setOval desde dentro de su clase interna, d debe estar en el ámbito cuando se llama al método actionPerformed. Hay un par de maneras de lograr esto: se podría hacer d una variable miembro de la clase, ya que podría definir su ButtonListener como una clase anónima

.

Por ejemplo, si guardó d como una variable miembro a continuación, el código sería el siguiente:

public class ButtonPanel {
 private GUIApp d;

 public ButtonPanel(GUIApp d) {
  this.d = d;
  // The rest of your code here...
 }
}

O, usted podría utilizar una clase anónima como esto:

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 ...
}

Nota:. Nota como también he cambiado el uso de == a equals() para la igualdad de objetos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top