Autor Tema: Colorear un panel JPanel desde otro con botones. Java eventos clases paneles  (Leído 5794 veces)

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Hola a todos!

A ver si alguien me puede echar una mano con este ejercicio. Basicamente lo que deseo con este ejercicio es tener crear 2 paneles en 2 clases independientes, para más tarde añadirlos a un panel principal que pertenece a otra clase.Mi objetivo es que al pulsar los botones “azulito” y “rojito” del Panel1, el fondo del Panel2 cambie de color, a azul o rojo en dependencia del botón pulsado, y ESTO NO OCURRE(supongo que falla porque en el método “public void actionPerformed(ActionEvent e)” en la parte “setBackground(Color.blue);” no logra “conectar” con el Panel2 para poder colorearlo, pero no sé como hacerlo)

Sé que lo puedo hacer de otro modo(por ejemplo, poniendo todos los paneles en la misma clase) y me sale el problema correctamente. PERO como estoy practicando, básicamente quiero practicar todas las posibilidades, en este caso practico la posibilidad de tener 2 paneles de clases independientes que añado a un panel principal que pertenece a otra clase. O sea si no es mucho pedir no me interesaría cambiar el plantemiento(a ser posible) de mi programa, sino saber por qué me falla y una posible solución
Código: [Seleccionar]



import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class BotonCambioColor2 extends JFrame{
JPanel principal=new JPanel();
Panel1 p1;
Panel2 p2;

public BotonCambioColor2(){

super("Titulo de la barra");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,400);

p1=new Panel1();
p2=new Panel2(p1); //Creo que debo pasarle p1...analizarlo bien


p1.setBorder(BorderFactory.createLineBorder(Color.black));
p2.setBorder(BorderFactory.createLineBorder(Color.black));

BoxLayout disenyo=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(disenyo);

principal.add(p1);
principal.add(p2);

add(principal);
setVisible(true);
}



public static void main(String[]args){
BotonCambioColor2 bot=new BotonCambioColor2();
}

}

class Panel1 extends JPanel{

JButton azulito;
JButton rojito;

Panel2 pane=new Panel2(this);

Panel1(){
azulito=new JButton("Azul");
rojito=new JButton("Rojo");

azulito.addActionListener(pane);
rojito.addActionListener(pane);

add(azulito);
add(rojito);

}

}

class Panel2 extends JPanel  implements ActionListener{


Panel1 pan;

public Panel2(Panel1 panee){

pan=panee;
}
@Override
public void actionPerformed(ActionEvent e) {

Object fuente=e.getSource();

if(fuente==pan.azulito){
setBackground(Color.blue);
}else if(fuente==pan.rojito){
setBackground(Color.red);
}


}
}


Por ejemplo el siguiente programa(tambien lo he  hecho para practicar) es de una idea similar y no sé por qué en este caso me sale correctamente y con el anterior programa no(de hecho pensaba que el anterior me saldría también ya que empleo la misma logica) .

Código: [Seleccionar]
package Ejer6;

import java.awt.*;
import javax.swing.*;

public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();
JPanel panel3=new JPanel();

PanelArriba arriba=new PanelArriba(this);
JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");
JButton a=new JButton("A");
JButton b=new JButton("B");
JButton c=new JButton("C");

public PanelPrincipal(){

super("Panel principal");

setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

rojo.addActionListener(arriba);
azul.addActionListener(arriba);
a.addActionListener(arriba);
b.addActionListener(arriba);
c.addActionListener(arriba);



panel2.add(rojo);
panel2.add(azul);
panel3.add(a);
panel3.add(b);
panel3.add(c);

principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));
panel3.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.setBorder(BorderFactory.createLineBorder(Color.black));

BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS); //Gestor de diseño
principal.setLayout(horizontal);

principal.add(arriba);
principal.add(panel2);
principal.add(panel3);

add(principal);

setVisible(true);


}


public static void main(String[]args){
PanelPrincipal p=new PanelPrincipal();

}
}
Código: [Seleccionar]
package Ejer6;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class PanelArriba extends JPanel implements ActionListener{
PanelPrincipal pa;
JLabel etiqueta=new JLabel();
public PanelArriba(PanelPrincipal princip){
this.pa=princip;
add(etiqueta);

}


@Override
public void actionPerformed(ActionEvent e) {

Object ob=e.getSource();

if(ob==pa.azul){
setBackground(Color.blue);
}else if(ob==pa.rojo){
setBackground(Color.red);
}else if(ob==pa.a){
etiqueta.setText("A");
}else if(ob==pa.b){
etiqueta.setText("B");
}else if(ob==pa.c){
etiqueta.setText("C");
}
}


}

Muchisimas gracias por todo, saludos!!!!!!!!!!!!
« Última modificación: 27 de Agosto 2015, 19:56 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola caludo, en la clase BotonCambioColor2 tienes:

- El código de la clase BotonCambioColor2

- El método main

- Una clase interna Panel1

- Una clase interna Panel2

Esto es "una mezcla de muchas cosas" dentro de una clase y en general esto se calificaría como un mal diseño. Sería preferible ordenar las clases como clases independientes, no como clases internas. Desde el punto de vista de diseño no se le ve lógica a que un panel sea una clase interna de un botón.

Partir de malos diseños lleva a malos códigos, difíciles de revisar y depurar.

Veo recomendable que sigas el curso https://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188 si no lo has hecho para adquirir fundamentos de diseño

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Hola Cesar, una vez más gracias por responderme.La verdad es que estoy aprendiendo de forma autodidacta así que el curso que me indicas me irá de maravilla, así que una vez más gracias.
Sé que lo que estoy haciendo son experimentos, basicamente para saber lo que se puede y no se puede hacer, el ejercicio que hice de con la clase BotonCambioColor2 lo que intento es ver como puedo hacer que un Panel que ya está hecho(por ejemplo por otra persona) pueda formar parte de otro Panel que yo haga, es por eso que lo he hecho de esa manera, con las clases internas, para poder diferenciar las clases de los paneles. Y por eso preguntaba por qué en el segundo "experimento" no me sale correctaamente. Sé que lo que hago no es lo ideal, pero digamos que intento ver todo tipo de posibilidades(de ahí mis experimentos) y encontrarle lógica a los posibles fallos

 

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