GUI en Java, clases particulares de escucha no trabaja
-
02-10-2019 - |
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?
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