Hola! A ver si alguien me puede sacar de una duda!
Quiero hacer el mismo programa de 3 maneras diferentes. Mi intensión es tener un botón en un Panel, en una clase que extiende de JFrame y tener otro Panel hecho en otra clase, el cual cambia de color al pulsar el botón. Sé que se puede hacer todo en una misma clase(sin tener que hacerlo en 2 clases diferentes), pero lo que intento es practicar y “experimentar” todas las posibilidades que se me ocurran para así poder entenderlo mejor.
Este sería el primer programa, el cual entiendo perfectamente, así que no tengo dudas:
package masPrueb;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Cambi extends JFrame {
JPanel principal;
JPanel arriba;
static JButton rojit;
static Panel2 pan;
public Cambi(){
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
principal=new JPanel();
arriba=new JPanel();
rojit=new JButton("Rojo");
pan=new Panel2();
rojit.addActionListener(pan);
BoxLayout vertical=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(vertical);
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.add(rojit);
principal.add(arriba);
principal.add(pan);
add(principal);
setVisible(true);
}
public static void main(String[]args){
new Cambi();
}
}
class Panel2 extends JPanel implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object fuente=e.getSource();
if(fuente==Cambi.rojit){
Cambi.pan.setBackground(Color.red);
}
}
}
Este sería el segundo programa(las dudas que tengo las he puesto como comentarios). Sé que este funciona correctamente pero quisiera aclarar las dudas que he puesto en los comentarios:
package otra.vez.eventos;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class CambioColor2Clases extends JFrame {
JPanel principal;
JPanel arriba;
JButton azulit;
Panel2 pan;
public CambioColor2Clases(){
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
principal=new JPanel();
arriba=new JPanel();
azulit=new JButton("Azul");
pan=new Panel2(this);
azulit.addActionListener(pan);
BoxLayout vertical=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(vertical);
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.add(azulit);
principal.add(arriba);
principal.add(pan);
add(principal);
setVisible(true);
}
public static void main(String[]args){
new CambioColor2Clases();
}
}
class Panel2 extends JPanel implements ActionListener{
//Mi duda empieza desde este punto hasta......
CambioColor2Clases cam2;
Panel2(CambioColor2Clases c2){
this.cam2=c2;
}
//..........Mi duda termina en este punto
/*O sea mi duda aqui es por que no tengo que crear el objeto para
* poder "conectar" las dos clases...o ¿ es porque al declarar
* "CambioColor2Clases cam2" y despues en el constructor pasarle como
* argumento "CambioColor2Clases c2" e igualarlo, así estoy creando
* indirectamente el objeto?????Esa es basicamente mi duda en este programa
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object fuente=e.getSource();
if(fuente==cam2.azulit){
cam2.pan.setBackground(Color.blue);
}
}
}
Y este es tercer programa , el cual no me funciona, las dudas las escribo en los comentarios
package masPrueb1;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Cambi extends JFrame {
JPanel principal;
JPanel arriba;
JButton verde;
Panel2 pan;
public Cambi(){
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
principal=new JPanel();
arriba=new JPanel();
verde=new JButton("verde");
pan=new Panel2();
verde.addActionListener(pan);
BoxLayout vertical=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(vertical);
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.add(verde);
principal.add(arriba);
principal.add(pan);
add(principal);
setVisible(true);
}
public static void main(String[]args){
new Cambi();
}
}
class Panel2 extends JPanel implements ActionListener{
Cambi c=new Cambi(); //Aqui creo un objeto de Cambi para poder usarlo
//en el metodo actionPerformed, pero al usar "c.verde" o "c.pan" en el
//metodo actionPerformed, ahí no lo detecta y no sé por qué
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object fuente=e.getSource();
if(fuente==c.verde){
c.pan.setBackground(Color.green);
}
}
}
Quisiera aclarar que lo sé hacer de una manera más ordenada y con un diseño más coherente(me indicó a hacerlo de la manera correcta uno de los expertos de este foro), pero quisiera saber(independientemente del diseño) cuales son los fallos del tercer programa, y la explicación que expongo en los comentarios del segundo. Basicamente lo que hago es “experimentar” varias formas de hacer un mismo ejercicio para así entender el “por qué” de los posibles errores
Muchisimas gracias por la ayuda!!!!