Intercambio entre clases de JPanel dentro de un JFRAME

afhn

Hola compañeros. Necesito una pequeña ayuda con esto y a ver si alguien consigue echarme una mano. Voy a intentar ser lo más claro posible para un mejor entendimiento.

Veréis, tengo un proyecto de clase en el cual, tengo 5 clases con sus métodos, a esos métodos los llamo desde un JPanel que se encuentra visible como capa dentro de una ventana JFrame.
Todo es independiente, tengo una clase Ventana extends JFrame, donde tengo toda la configuración de la ventana, y tengo después varias clases capa de cada clase extends JPanel con sus métodos y configuraciones.
La cuestión es la siguiente; en cada JPanel hay botones los cuales, me deberían llevar a otra clase JPanel que contiene su propio constructor que es diferente del resto de clases JPanel. He probado infinidad de cosas y no sé cómo lograr desde el JFrame que pulsando un botón en el JPanel cambie a otro JPanel sin que me salgan 20 millones de ventanas, que es lo que quiero lograr evitar.

Alguna idea?
No me digáis que lo haga con el programa ese que, en verdad me gustaría, pero nos lo han mandado que lo hagamos de esta forma, que la verdad es un coñazo.
Gracias de antebrazo. Le invitaría a una cerveza al que logre conseguir ayudarme y que me funcione, si es de Madrid claro está xD.
PD: no sé si la etiqueta que he puesto es la correcta U.U.

B

Lo mas sencillo y bonito que se me ocurre para decirte es que utilices un JTabbedPane que establece pestañas en las cuales puedes cambiar de JPanel como dices, si necesitas apuntes para usarlo correctamente te puedo dejar y cualquier cosa tienes en la documentacion oficial

https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html

2 respuestas
Ranthas

#1 como te dice el amigo de #2, un TabbedPanel es lo más elegante, si distribuyes en cada pestaña los paneles que tienes dando vueltas.

Si estás forzado a hacerlo con paneles y ya, piensa que no puedes tener 15 paneles uno encima de otro en el JFrame, cada uno debe ir en su ventanita que es justo lo que no quieres pq se queda todo petado de ventanas. Lo ideal sería que al pulsar el botón, ocultes la ventana actual y muestres la nueva y ocultes la vieja, que a su vez tiene un botón para regresar a la ventana actual.

1 respuesta
afhn

#3 como bien dices, no puedo hacerlo con lo que me aconseja #2, que sinceramente, parece una opción razonable.
Pero el método que comentas sí que me valdría. Que cada vez que le de a un botón genere una nueva ventana con la nueva capa ocultando la otra. He probado, y la funcionalidad es aceptable:
he añadido esto en la clase antes de crear el constructor;

Ventana ventana;
CapaJugadorAvanzado capaJugAvan;

He añadido en el constructor un this.ventana=ventana incluyendo el parámetro en el constructor más los getter y setter.
Después he metido esto en el Listener del botón para que cambie, y repetido lo mismo en otra clase. Ha cambiado satisfactoriamente.

ventana.setVisible(false);
ventana = new Ventana();
capaJugAvan = new CapaJugadorAvanzado(ventana);
ventana.add(capaJugAvan);
ventana.setVisible(true);

En verdad era tan simple... Madre mía...

1 1 respuesta
Ranthas

#4 A veces las soluciones más fáciles son las más chungas de ver.

1 respuesta
afhn

#5 Me lo dicen mucho. Es que siempre le doy muchas vueltas e intento buscar formas raras de sacar las cosas. Creo que me complico demasiado xd.

Usuarios habituales