Hola a todos!
Tengo unas dudas de concepto y si es posible quisiera que alguien me explicara lo más detalladamente posible por qué lo del segundo programa ES UN DISPARATE!!!!!???
He hecho 2 programas iguales, pero en el segundo he cambiado un par de lineas que hace que no me funcione.Si analizo el primer ejercicio sé por qué está bien(básicamente porque funciona
![Lengua :P](https://aprenderaprogramar.com/foros/Smileys/default/tongue.gif)
), pero no sé exactamente por qué el segundo está mal.
Mi plantemiento en el segundo es: Si en la clase PanelArriba creo un objeto(creado-->"PanelPrincipal pa=new PanelPrincipal();") de la clase PanelPrincipal,
entonces ese objeto creado puedo usarlo dentro del metodo actionPerformed sin problemas y así hacer que el programa funcione).Sé que este planteamiento es erroneo, y me gustaría saber por qué
A ver si hay suerte (siempre la ha habido en este foro:P) y alguien me puede ayudar, así voy avanzando en mis estudios básicos de Java. Muchas gracias por todo y saludos!!!!
PS. En los comentarios del segundo programa puntualizo los cambios con respecto al primero
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();
PanelArriba arriba=new PanelArriba(this);
JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");
public PanelPrincipal(){
super("Panel principal");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rojo.addActionListener(arriba);
azul.addActionListener(arriba);
panel2.add(rojo);
panel2.add(azul);
principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(horizontal);
principal.add(arriba);
principal.add(panel2);
add(principal);
setVisible(true);
}
public static void main(String[]args){
PanelPrincipal p=new PanelPrincipal();
}
}
class PanelArriba extends JPanel implements ActionListener{
PanelPrincipal pa;
public PanelArriba(PanelPrincipal princip){
this.pa=princip;
}
@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);
}
}
}
Aqui dejo el segundo (que es como el primero PERO con algunos cambios que hace que NO funcione)
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class PanelPrincipal extends JFrame{
JPanel principal=new JPanel();
JPanel panel2=new JPanel();
PanelArriba arriba=new PanelArriba(); //Aqui hay un cambio con respecto al primer programa.
//Esta linea anteriormente era---->"PanelArriba arriba=new PanelArriba(this);"
JButton rojo=new JButton("Rojo");
JButton azul=new JButton("Azul");
public PanelPrincipal(){
super("Panel principal");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rojo.addActionListener(arriba);
azul.addActionListener(arriba);
panel2.add(rojo);
panel2.add(azul);
principal.setBorder(BorderFactory.createLineBorder(Color.black));
panel2.setBorder(BorderFactory.createLineBorder(Color.black));
arriba.setBorder(BorderFactory.createLineBorder(Color.black));
BoxLayout horizontal=new BoxLayout(principal,BoxLayout.Y_AXIS);
principal.setLayout(horizontal);
principal.add(arriba);
principal.add(panel2);
add(principal);
setVisible(true);
}
public static void main(String[]args){
PanelPrincipal p=new PanelPrincipal();
}
}
class PanelArriba extends JPanel implements ActionListener{
PanelPrincipal pa=new PanelPrincipal();
//En el programa anterior aqui tenía un constructor y le pasaba como parametros "PanelPrincipal princip" ...
//...en este al no tener que pasarle parametro no hago un constructor
@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);
}
}
}