Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: caludo en 26 de Agosto 2015, 01:28
-
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!!!!!!!!!!!!
-
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!
-
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