Java - Re:Java. Llamar a una clase JPanel desde otro panel en una clase JFrame.Duda

   
Vista:

Re:Java. Llamar a una clase JPanel desde otro panel en una clase JFrame.Duda

Publicado por caludo (1 intervención) el 05/10/2015 02:23:02
Hola! A ver si alguien me puede sacar de una duda!
Quiero hacer el mismo programa de 2 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(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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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 el segundo programa , el cual no me funciona, las dudas las escribo en los comentarios

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package masPrueb1;
 
import java.awt.*;
 
import javax.swing.*;
 
import java.awt.event.*;
 
public class ClasePrincipal extends JFrame {
	/*La idea es que haya un panel("panelPrincipal") que tenga 2 paneles: Uno 
	 * superior("panelSuperior") que en su interior tiene un botón("botonVerde")
	 * y otro panel inferior("panelInferior") que cambie de color al pulsar
	 * el botón "botonVerde".Para este panel inferior creo una nueva clase("Panel2")
	 * y el panel inferior es un objeto de dicha clase	
	*/
JPanel panelPrincipal;
JPanel panelSuperior;
JButton botonVerde;
Panel2 panelInferior;
 
public ClasePrincipal(){
 
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
panelPrincipal=new JPanel();
panelSuperior=new JPanel();
botonVerde=new JButton("verde");
panelInferior=new Panel2(); //Panel inferior.Creado de la clase "Panel2"
 
 
 
 
botonVerde.addActionListener(panelInferior);
 
//Gestor de diseño
BoxLayout vertical=new BoxLayout(panelPrincipal,BoxLayout.Y_AXIS); //Gestor de diseño
panelPrincipal.setLayout(vertical);
panelSuperior.setBorder(BorderFactory.createLineBorder(Color.black));
 
//Añado los componentes(paneles y boton) al Panel principal,despues
//añado el panel principal al marco(clase Cambi)
panelSuperior.add(botonVerde);
panelPrincipal.add(panelSuperior);
panelPrincipal.add(panelInferior);
add(panelPrincipal);
 
 
setVisible(true);
}
 
 
public static void main(String[]args){
 
	new ClasePrincipal();
 
}
 
}
 
class Panel2 extends JPanel implements ActionListener{
	ClasePrincipal princip=new ClasePrincipal();  /*Mi duda esté en esta
segunda clase("Panel2),y es que "mi lógica"(por supuesto no es correcto
porque el programa me da error)dice que creando un objeto("princip") de
la clase ClasePrincipal puedo acceder "botonVerde" y a "panelInferior"
y así al pulsar el boton se puede cambiar el color del panel inferior 
...así haciendo el "if" en el metodo actionPerformed:
Si la fuente es el boton verde,entonces cambiar el color del panel inferior..
pero esto no ocurre ya que me da error
	*/
	

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub

		
		Object fuente=e.getSource();
	if(fuente==princip.botonVerde){ 
		princip.panelInferior.setBackground(Color.green);
		
	}
		
		
	}

}

Quisiera aclarar que lo sé hacer de una manera más ordenada y con un diseño más coherente, pero quisiera saber(independientemente del diseño) cuales son los fallos del segundo programa, y la explicación que expongo en los comentarios del primero. 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!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder