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
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) .
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();
}
}
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!!!!!!!!!!!!