Manejo de Eventos

¿Cómo estás?. Espero que Bien
Mi consulta es la Siguiente:
Soy nuevo en java y estoy Aprendiendo a Manejar los eventos de las Aplicaciones utilizando clases que heredan de los Adapter(como por ejemplo windowAdapter) y para eso estoy haciendo una Aplicación de Practica.el código del .java es el siguiente:
import java.awt.*;
import java.awt.event.*;
public class Alexis extends Frame{
public static void main(String[] args) {
Frame ventana=new Frame("Ventana de Alexis");
Button b1=new Button("Alexis");
Button b2=new Button("Sánchez");
Label l1=new Label("Resultado");
ventana.add(b1);
ventana.add(b2);
ventana.add(l1);
b1.setBounds(30,90,50,20);
b2.setBounds(100,90,60,20);
l1.setBounds(60,70,60,20);
cerrar cv=new cerrar();
boton1 bt1=new boton1();
ventana.setLayout(null);
ventana.setBounds(100,100,170,140);
ventana.setResizable(false);
ventana.addWindowListener(cv);
b1.addActionListener(bt1);
ventana.show(true);
}
}
class cerrar extends WindowAdapter{
public void windowClosing(WindowEvent we){
System.exit(0);
}
}
class boton1 extends ComponentAdapter{
public void actionPerformed(ActionEvent ae){
l1.setText("Alexis");
}
}
He logrado cerrar la ventana que he creado(me refiero a "ventana" de tipo frame) utilizando una clase que hereda de windowAdapter, pero cuando intento manejar el evento actionPerformed para mi botón(b1) utilizando una clase que hereda de ComponentAdapter no me permite agregarcela al botón como actionListener y Además no me permite manipular el label(l1) desde la clase boton1
¿Por qué no puedo manejar el evento del botón b1 Utilizando la Clase boton1?
¿Por qué la Clase boton1 no Puede manipular mi Label l1?
¿Qué estoy Haciendo Mal y Como Lo resuelvo?

1 Respuesta

Respuesta
1
Bueno en primer lugar mi nombre no es Andres... y estoy bien gracias. Bueno respondiendo a tu pregunta: "¿Por que no puedo manejar el evento del botón b1 Utilizando la Clase boton1? La razón es porque tu clase "boton1" (que por cierto me parece un mal nombre para una clase) no es un ActionListener, para que tu clase "boton1" pueda ser usada como un ActionListener, esta debe implementar la interface java.awt.event.ActionListener quedando así:
class boton1 implements ActionListener {


public void actionPerformed(ActionEvent ae){

... Lo que quieras hacer cuando hagan click en el botón va aquí ...

}
}

Respondiendo a tu segunda pregunta: "¿por que la Clase boton1 no Puede manipular mi Label l1?" La razón es porque "l1" es una variable que es definida dentro del método main y por lo tanto solo es visible dentro del método main ( eso es lo que se llama el contexto o alcance de una variable o "scope" en ingles)... tu clase interna "boton1" no tiene ni idea que esa variable existe... así que si quieres que tu clase "boton1" tenga acceso a "l1" debes o bien declarar "l1" en un lugar o contexto donde pueda ser visible por tu clase "boton1"... otra alternativa seria pasarle por parámetro "l1" a tu objeto "bt1" y así tu clase "boton1" tendría una referencia de "l1" sin importar donde la haya sido definida (aunque pasar por parámetro componentes gráficos a otra clase no es una buena practica, porque la clase donde reside el componente perdería el control sobre el componente gráfico, dejando que la clase externa haga con ese componente lo que quiera... en lugar de eso tu clase debería proporcionar métodos que permitan modificar o obtener atributos de los componentes que pertenecen a ella, pero eso es otra historia) siguiendo entonces con la solución que te propongo tu clase "boton1" quedaría así:
.. en tu método main haz esto:
// Pasamos por parámetro "l1" a nuestro objeto bt1 al constructor
// De la clase "boton1", así la clase "boton1" puede tener acceso a "l1"
boton1 bt1=new boton1(l1);
.. ahora la clase "boton1" debe modificar su constructor para que reciba un Label como argumento...
class boton1 implements ActionListener {
private Label myLabel;

// constructor
public boton1(Label myL1){
this.myLabel = myL1;
}
public void actionPerformed(ActionEvent ae){
myLabel.setText("Hola mundo!");
}
}

Y en cuanto a tu pregunta: "¿Que estoy Haciendo Mal y Como Lo resuelvo?"
Sinceramente hay muchas cosas que estas haciendo mal, y es normal cuando se esta empezando (así que no te sientas mal... de los errores es que aprendemos).
Una de las cosas que estas haciendo mal es que has definido tu clase "Alexis" para que extienda a Frame y nunca haces uso de ella como un Frame, por lo tanto no hay razón para que tu clase Alexis extienda a Frame ... debería ser así:
public class Alexis {
...
}

Esto en realidad no afecta en nada a tu programa pero hace que sea más fácil de entender. Ahora si lo que quieres es hacer que tu clase Alexis extienda a Frame y usarla como un Frame, debes crear un constructor y prácticamente hacer todo lo que estas haciendo en tu método main dentro del constructor de tu clase Alexis, cambiando todas las refecencias a "ventana" por "this", limitando así a tu método main a simplemente crear un objeto Alexis. Seria algo así:
public class Alexis extends Frame{
// constructor de la clase Alexis
public Alexis(String titulo){
super(titulo);
Button b1=new Button("Alexis");
Button b2=new Button("Sánchez");
Label l1=new Label("Resultado");
this.add(b1);
this.add(b2);
this.add(l1);
b1.setBounds(30,90,50,20);
b2.setBounds(100,90,60,20);
l1.setBounds(60,70,60,20);
cerrar cv=new cerrar();
boton1 bt1=new boton1();
this.setLayout(null);
this.setBounds(100,100,170,140);
this.setResizable(false);
this.addWindowListener(cv);
b1.addActionListener(bt1);
}
public static void main(String[] args) {
Alexis ventana=new Alexis("Ventana de Alexis");
ventana.show(true);
}
... lo demas va aqui ...
}

Bueno eso todo, espero que no veas mi respuesta como una critica negativa hacia tus errores... si ese es el caso te pido disculpas, mi motivación es ayudarte... Suerte y por favor no olvides finalizar la pregunta.
Hola ¿Alejo?,¡Muchas Gracias Por tu Excelente Respuesta y tu Buena Disposición!
No me molestan para nada tus consejos y criticas, de hecho han sido las mejores que me han hecho desde que inicie con java(gracias por tu franqueza y perdón por lo de "Andrés").
De Nuevo Gracias y que el señor te bendiga
saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas