Autor Tema: Java. Llamar a una clase JPanel desde otro panel en una clase JFrame.Duda  (Leído 16956 veces)

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
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:
Código: [Seleccionar]
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:
Código: [Seleccionar]
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
Código: [Seleccionar]
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!!!!

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java. Llamar a una clase JPanel desde otro panel en una clase JFrame.Duda
« Respuesta #1 en: 01 de Octubre 2015, 16:15 »
Ufff si es complicadillo de seguir si, sobre todo por los nombres etc.
Sobre la pregunta del segundo, básicamente tu te respondes, en el momento que asignas c2 a cam2 que es un objeto de la misma clase que el anterior, realmente lo que haces es que cam2 apunte a la memoria que ocupa el objeto c2, así que son idénticos a partir de ahí si.
El último código lo miró luego y respondo.

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Java. Llamar a una clase JPanel desde otro panel en una clase JFrame.Duda
« Respuesta #2 en: 02 de Octubre 2015, 12:16 »
Bueno el otro código, es algo caótico, y cuando he ido a ejecutarlo, lo de que Panel2 cree un Combi y Combi cree un Panel2 , no tengo conocimientos para entenderlo bien y además me saltaba error.

Por ayudarte un poco, lanzo ideas aleatorias y si alguna te sirve genial.


   
Código: [Seleccionar]
Object fuente=e.getSource();
if(fuente==c.verde){
c.pan.setBackground(Color.green);
esto me es confuso, si quieres que al clicar el boton, si el texto del boton es "verde" pinte de verde, hay un evento clickEvent creo que es, de los JButton, que basicamente, al apretar el boton hace lo que le dices.

Cuando llamas a c.verde, es una variable de la otra clase, mejor crea un metodo getVerde()  que sea publico y llamas a c.getVerde(), más seguro y menos problemas al ser publico.

De momento se me ocurren esas dos, el metodo main deberia estar en panel2 si es el que ejecuta la accion? no lo sé, no tengo claro lo que quieres hacer ahí pero mis conocimientos son bastante escasos la verdad.

Saludos caludo.

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Re:Java. Llamar a una clase JPanel desde otro panel en una clase JFrame.Duda
« Respuesta #3 en: 03 de Octubre 2015, 11:27 »
Muchas gracias Lorenzo, lo volveré a hacer, mejor explicado y que se entienda un poco mejor....gracias por la explicación en el segundo(era lo que buscaba...una explicación a lo que había hecho), y sobre el tercero a mi también me da error y no entiendo(con mi lógica, que posiblemente sea erronea) por qué, pero lo haré más "entendible"

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".