Java - Problema al moverme por los JPanel

 
Vista:
sin imagen de perfil

Problema al moverme por los JPanel

Publicado por Zhukov (11 intervenciones) el 02/03/2012 19:19:39
Hola

Estoy creando una aplicación compuesta por un único Jframe y distintos JPanel. A continuación explico su estructura y propongo la duda que tengo.


El Jframe contiene:
--> Barra menu
--> Jpanel (llamado contenedor) que contendrá el resto de JPanel que se crearán

JPanel1
-->panel_izq
-->panel_dcho que contiene un boton

JPanel2
-->panel_izq2
-->panel_dcho2 que contiene un boton


Bien, pues la operativa es la siguiente:
Lanzamos la aplicación y nos abre el frame, pulsamos Archivo-> nuevo panel y cargamos el JPanel1 en el contenedor del JFrame. Hasta aquí todo bien.

El problema viene cuando al pulsar el boton de panel_dcho quiero borrar el Jpanel1 y sustituirlo por el Jpanel2, ya que consigo destruir el Jpanel1 pero no crear el Jpanel2 y cargarlo en el contenedor del Jframe.

Quizas no me haya explicado muy bien, de ser así decirmelo y trato de poner codigo.

Gracias !
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

Problema al moverme por los JPanel

Publicado por Javier (15 intervenciones) el 03/03/2012 21:57:59
Imagino que el panel_dcho tiene un boton que destruye ese panel y muestra otro!


Pues deberia ser algo asi

miframe.removeall();
JPanel panel2 = new JPanel();
panel2.add(new JButton("Boton_DCHO");

miframe.add(panel2,BorderLayout.CENTER);

Puedes omitir el BorderLayout y solo add el panel2, todo depende como quieras el layout, de igual forma haces para sustituir el jpanel2 por el panel1 :P

suerte ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema al moverme por los JPanel

Publicado por Zhukov (11 intervenciones) el 05/03/2012 11:29:25
Hola Javier, gracias por contestar.

El código que expones a mi entender es correcto, pero tengo un problema que es por lo que plantee esta duda (quizás debiera haberlo puesto) y es que desde los paneles que cargo en el contenedor del JFrame, es decir, el JPanel1 y el JPanel2, no tengo acceso al JFrame principal de la aplicación y no entiendo el porqué.

Es decir, este tipo de llamada no puedo hacerla

miframe.un_método();

Si tienes idea de que puede pasar te agradecería una respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al moverme por los JPanel

Publicado por Javier (15 intervenciones) el 05/03/2012 12:41:10
hmmmm antes de explicarte deberias decirme si tus JPanel los creas aparte del JFrame
es decir haces un

public class MiPanel extends JPanel?

o los estas instanciando directamente de JPanel?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema al moverme por los JPanel

Publicado por Zhukov (11 intervenciones) el 05/03/2012 13:17:40
Creo que es mejor que exponga unas pocas lineas de codigo a medida que voy haciendo una explicación:

La idea fundamental es la de realizar una aplicación que constará de un único JFrame que tiene una barra de menú y un Jpanel llamado "contenedor" que contendrá al resto de paneles que iré creando a lo largo de la aplicación.

Esta clase lanza la ventana principal de la aplicación:

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main(String[] args) {
        VPrincipal  vppal = new VPrincipal();
        vppal.setTitle("Aplicacion PC");
        vppal.setExtendedState(vppal.MAXIMIZED_BOTH);
        vppal.setDefaultCloseOperation(vppal.EXIT_ON_CLOSE);
        vppal.setVisible(true);
    }
}


Estando en la ventana principal que ha creado el main de la aplicación, pulso la opcion "Nuevo" de la barra de menú que lo que hace es generar un Jpanel y cargarlo en el panel contenedor del Jframe

1
2
3
4
5
6
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
        PNueva_excursion pnuevaex = new PNueva_excursion();
        pnuevaex.setSize(this.contenedorFrame.getSize());
        this.contenedorFrame.add(pnuevaex);
        this.contenedorFrame.updateUI();
}


Ahora bien, habiendo cargado este nuevo jpanel en el contenedor de la ventana de la aplicación, quiero que al pulsar un botón de este JPanel llamado pnuevaex, se destruya dicho panel (es decir, pnuevaex) y en su lugar cargar el nuevo panel en el contenedor de la ventana principal. Y es aquí donde me surge el problema ya que yo lo que haria sería:



1
2
3
4
5
6
7
8
9
//Eliminar todos los componentes del contenedor del JFrame
vppal.contenedor.removeAll();
 
//Crear el nuevo panel
        PConfigurar_actividades pconfactiv = new PConfigurar_actividades();
        pconfactiv.setSize(vppal.contenedor.getSize());
        vppal.contenedor.add(pconfactiv);
 
        this.updateUI();


Ahora bien, esto sería en mi mundo ideal ya que como he dicho anteriormente, mi problema es que desde este panel no tengo acceso a mi ventana "vppal"

por lo que no puedo realizar ninguna operación del tipo "vppal.un_metodo" :(

Espero que me hayas entendido mejor.

Un saludo y de nuevo gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema al moverme por los JPanel

Publicado por Javier (15 intervenciones) el 05/03/2012 13:36:15
:) ya entendi :)

mira lo puedes hacer de la forma mediocre o la forma que deberia hacerse.....
la mejor forma para comunicar tu panel al vppal es con interfaces, aqui te explico como hacer para que al pulsar un boton de tu panel llame a un metodo de vppal.

Recuerda que una interfaz es simplemente "un comportamiento o acciones que puede tener una clase" y es perfecta para comunicar componentes graficos

creas la interfaz

public interface MiInterfaz {
public void accion();
}

luego la implementas en tu vppal asi

public class VPrincipal extends JFrame implements MiInterfaz

Luego anades a tu clase el metodo accion

public void accion() {
// Aqui ira el codigo para intercambiar paneles
}

Luego facilmente le agregas un objeto a tus paneles para poder llamar al metodo accion, es decir
cuando instancias PNueva_Excursion le mandas la instancia de la interfaz que sera "this" lo haces asi
1
PNueva_excursion pnuevaex = new PNueva_excursion(this);


Luego en el constructor de PNueva_exrusion guardas el objeto MiInterface como variable global

1
2
3
public PNueva_excursion(MiInterface m) {
interface = m;
}


Suponiendo claro que ya declarase globalmente MiInterface interface; en el panel

y finalmente en el metodo del Actionperformed de tu boton llamas accion atravez de la interface :)

1
interface.accion()


:) y ya esa es la forma correcta de comunicar clases graficamente.....

aunque es un poco compleja de entender al principio es como se deberia hacer... :)

y como vi estas intermbiando paneles entonces al otro panel le haces lo mismo que al excursion :)

suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema al moverme por los JPanel

Publicado por Zhukov (11 intervenciones) el 05/03/2012 16:43:07
Gracias Javier por la ayuda

Voy a ponerme con la implementación ahora, espero no tener problemas ya que veo con el ejemplo que has puesto la idea que tienes.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema al moverme por los JPanel

Publicado por Zhukov (11 intervenciones) el 05/03/2012 13:29:03
Y perdoname que me he liado escribiendo y no he contestado finalmente a tu pregunta.

La respuesta es Sí, yo tengo un paquete llamado Vista en el cual está un único Frame

public class VPrincipal extends javax.swing.JFrame

y el resto son JPanel

public class PNueva_excursion extends javax.swing.JPanel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar