Autor Tema: JAVA Swing código Invocacion de un panel a otro con botón JPanel y JFrame Action  (Leído 650 veces)

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Buen día a todos

Quisera saber si puedo invocar un panel desde otro panel con un boton, en una extension JFrame.

En el caso digamos que mi panel principal es el de PanelBiblioteca.java y con el botón que tiene incluido de Siguiente hacer que aparezca el segundo panel PanelUsuario.java, y con el de anterior lo contrario, que desaparezca y viceversa

Mis códigos son:

PanelBiblioteca.java
Código: [Seleccionar]
package biblioteca;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public final class PanelBiblioteca extends JFrame implements ActionListener {

    JComboBox Año,Dia,Mes;
JLabel etiqNombre, etiqDireccion, etiqTelefono, etiqFNacim, etiqFInsc, etiqFVigen, etiqCodLib, etiqTitLib, etiqAutores, etiqISB, etiqEditorial, etiqAñoImpr, etiqNumCopias;
JTextField txtNombre, txtDireccion, txtTelefono, txtFNacim, txtFInsc, txtFVigen, txtCodLib, txtTitLib, txtAutores, txtISB, txtEditorial, txtAñoImpr, txtNumCopias, txtBuscar;
JButton BtnGuardar, BtnNuevo, BtnEliminar, BtnSalir, BtnBuscar,BtnSiguiente,BtnAnterior;;
JPanel panel;
    private String [] dias={"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"};
private Libro resultado;
private Persona usuario;
private PanelUsuario Us;
private String [] mes = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
private String[] año = {"2021","2022","2023","2024","2025","2026","2027","2028","2029","2030"};
PanelBiblioteca(){

resultado = new Libro();
usuario = new Persona();
Us = new PanelUsuario();
//Listas despegables
Mes= new JComboBox(mes);
Mes.setBounds(870, 52, 70, 20);
Dia= new JComboBox(dias);
Dia.setBounds(830, 52, 40, 20);
Año= new JComboBox(año);
Año.setBounds(940, 52, 70, 20);
//Etiquetas
etiqNombre = new JLabel("Nombre");
etiqNombre.setBounds(130, 30, 50, 20);
etiqDireccion = new JLabel("Direccion");
etiqDireccion.setBounds(245, 30, 70, 20);
etiqAutores = new JLabel("Autor(es)");
etiqAutores.setBounds(305, 100, 120, 20);
etiqTelefono = new JLabel("Teléfono");
etiqTelefono.setBounds(370, 30, 70, 20);

etiqFNacim = new JLabel("Fecha de Nacimiento");
etiqFNacim.setBounds(450, 30, 120, 20);
txtFNacim = new JTextField();
txtFNacim.setBounds(460, 55, 100, 20);
etiqFInsc = new JLabel("Fecha de Inscripción");
etiqFInsc.setBounds(650, 30, 120, 20);
etiqFVigen = new JLabel("Fecha de Vigencia");
etiqFVigen.setBounds(850, 30, 120, 20);
etiqCodLib = new JLabel("Código de Libro");
etiqCodLib.setBounds(45, 100, 120, 20);
etiqTitLib = new JLabel("Titulo");
etiqTitLib.setBounds(193, 100, 120, 20);
etiqISB = new JLabel("ISB");
etiqISB.setBounds(443, 100, 120, 20);
etiqEditorial = new JLabel("Editorial");
etiqEditorial.setBounds(550, 100, 120, 20);
etiqAñoImpr = new JLabel("Año de Impresión");
etiqAñoImpr.setBounds(640, 100, 120, 20);
etiqNumCopias = new JLabel("Número de Copias");
etiqNumCopias.setBounds(758, 100, 120, 20);


//Campos de texto
txtTelefono = new JTextField();
txtTelefono.setBounds(340, 55, 100, 20);
txtDireccion = new JTextField();
txtDireccion.setBounds(220, 55, 100, 20);
txtNombre = new JTextField();
txtNombre.setBounds(100, 55, 100, 20);
txtCodLib = new JTextField();
txtCodLib.setBounds(40, 125, 100, 20);
txtTitLib = new JTextField();
txtTitLib.setBounds(160, 125, 100, 20);
txtAutores = new JTextField();
txtAutores.setBounds(280, 125, 100, 20);
txtISB = new JTextField();
txtISB.setBounds(400, 125, 100, 20);
txtEditorial = new JTextField();
txtEditorial.setBounds(520, 125, 100, 20);
txtAñoImpr = new JTextField();
txtAñoImpr.setBounds(640, 125, 100, 20);
txtBuscar = new JTextField();
txtBuscar.setBounds(400, 270, 100, 20);
txtNumCopias = new JTextField();
txtNumCopias.setBounds(760, 125, 100, 20);
        //Botones
BtnGuardar = new JButton("Guardar");
BtnGuardar.setBounds(230, 200, 80, 20);
BtnGuardar.addActionListener(this);
BtnNuevo = new JButton("Nuevo");
BtnNuevo.setBounds(350, 200, 80, 20);
BtnNuevo.addActionListener(this);
BtnEliminar = new JButton("Eliminar");
BtnEliminar.setBounds(470, 200, 80, 20);
BtnSalir = new JButton("Salir");
BtnSalir.setBounds(590, 200, 80, 20);
BtnSalir.addActionListener(this);
BtnBuscar = new JButton("Buscar");
BtnBuscar.setBounds(410, 300, 80, 20);
BtnBuscar.addActionListener(this);
BtnSiguiente = new JButton("Siguiente");
BtnSiguiente.setBounds(430, 330, 80, 20);
BtnSiguiente.addActionListener(this);
BtnAnterior = new JButton("Anterior");
BtnAnterior.setBounds(240, 330, 80, 20);
BtnAnterior.addActionListener(this);


//Ventanas
panel = new JPanel();
panel.setLayout(null);

//Panel1
//Etiquetas añadidas al panel
panel.add(etiqNombre);
panel.add(etiqDireccion);
panel.add(etiqTelefono);
panel.add(etiqFNacim);
panel.add(etiqFInsc);
panel.add(etiqFVigen);
panel.add(etiqCodLib);
panel.add(etiqTitLib);
panel.add(etiqAutores);
panel.add(etiqISB);
panel.add(etiqEditorial);
panel.add(etiqAñoImpr);
panel.add(etiqNumCopias);
//Campos de texto añadidos al panel
panel.add(txtNombre);
panel.add(txtDireccion);
panel.add(txtTelefono);
panel.add(txtFNacim);
panel.add(txtCodLib);
panel.add(txtTitLib);
panel.add(txtAutores);
panel.add(txtISB);
panel.add(txtEditorial);
panel.add(txtAñoImpr);
panel.add(txtNumCopias);
panel.add(txtBuscar);
//Botones añadidos al panel
panel.add(BtnGuardar);
panel.add(BtnNuevo);
panel.add(BtnEliminar);
panel.add(BtnSalir);
panel.add(BtnBuscar);
panel.add(BtnSiguiente);
panel.add(BtnAnterior);
//Listas desplegables añadidas al panel
panel.add(Mes);
panel.add(Dia);
panel.add(Año);
panel.add(Us.panel2);
setTitle("                                                                                                  BIBLIOTECA CENTRAL");
add(panel);
setSize(1100, 400);
setVisible(true);






}

public static void main(String[] args) {
new PanelBiblioteca();
}//cerrar main


public void actionPerformed(ActionEvent e) {
String  c,t,a,ed,I,an,cop;
t=txtTitLib.getText();
c=txtCodLib.getText();
a=txtAutores.getText();
ed=txtEditorial.getText();
I=txtISB.getText();
an=txtAñoImpr.getText();
cop=txtNumCopias.getText();
Mes.getAction();
Dia.getAction();


if(e.getSource()==BtnGuardar) {



}if(e.getSource()==BtnBuscar) {

}

}if(e.getSource()==BtnNuevo) {

txtCodLib.setText("");
txtNombre.setText("");
txtAutores.setText("");
txtTitLib.setText("");
txtEditorial.setText("");
                txtISB.setText("");
txtNumCopias.setText("");
txtAñoImpr.setText("");
Mes.setAction(null);
Dia.setAction(null);
}if(e.getSource()==BtnSalir) {
System.exit(0);
if(e.getSource()==BtnSiguiente) {
panel.setVisible(false);
Us.panel2.setVisible(true);

}


}
}
}

PanelUsuario.java

Código: [Seleccionar]
package biblioteca;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class PanelUsuario extends JFrame implements ActionListener {

JComboBox Año2,Dia2,Mes2;
JLabel etiqNombre, etiqDireccion, etiqTelefono, etiqFNacim, etiqFInsc, etiqFVigen;
JTextField txtNombre, txtDireccion, txtTelefono, txtFNacim, txtFInsc, txtFVigen,txtBuscar;
JButton BtnGuardar, BtnNuevo, BtnEliminar,BtnBuscar,BtnSiguiente,BtnAnterior;
JPanel panel2;

private String [] dias={"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"};
private Libro resultado;
private Persona usuario;
private PanelBiblioteca library;
private String [] mes = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
private String[] año = {"2021","2022","2023","2024","2025","2026","2027","2028","2029","2030"};
PanelUsuario(){
resultado = new Libro();
usuario = new Persona();
//Listas despegables
Mes2= new JComboBox(mes);
Mes2.setBounds(870, 52, 70, 20);
Dia2= new JComboBox(dias);
Dia2.setBounds(830, 52, 40, 20);
Año2= new JComboBox(año);
Año2.setBounds(940, 52, 70, 20);
//Etiquetas
etiqNombre = new JLabel("Nombre");
etiqNombre.setBounds(130, 30, 50, 20);
etiqDireccion = new JLabel("Direccion");
etiqDireccion.setBounds(245, 30, 70, 20);
etiqTelefono = new JLabel("Teléfono");
etiqTelefono.setBounds(370, 30, 70, 20);
txtTelefono = new JTextField();
txtTelefono.setBounds(340, 55, 100, 20);
etiqFNacim = new JLabel("Fecha de Nacimiento");
etiqFNacim.setBounds(450, 30, 120, 20);
txtFNacim = new JTextField();
txtFNacim.setBounds(460, 55, 100, 20);
etiqFInsc = new JLabel("Fecha de Inscripción");
etiqFInsc.setBounds(650, 30, 120, 20);
etiqFVigen = new JLabel("Fecha de Vigencia");
etiqFVigen.setBounds(850, 30, 120, 20);
//Campos de texto
txtTelefono = new JTextField();
txtTelefono.setBounds(340, 55, 100, 20);
txtDireccion = new JTextField();
txtDireccion.setBounds(220, 55, 100, 20);
txtNombre = new JTextField();
txtNombre.setBounds(100, 55, 100, 20);
txtBuscar = new JTextField();
txtBuscar.setBounds(400, 270, 100, 20);
//Botones
BtnGuardar = new JButton("Guardar");
BtnGuardar.setBounds(230, 200, 80, 20);
BtnGuardar.addActionListener(this);
BtnNuevo = new JButton("Nuevo");
BtnNuevo.setBounds(350, 200, 80, 20);
BtnNuevo.addActionListener(this);
BtnEliminar = new JButton("Eliminar");
BtnEliminar.setBounds(470, 200, 80, 20);
BtnBuscar = new JButton("Buscar");
BtnBuscar.setBounds(410, 300, 80, 20);
BtnBuscar.addActionListener(this);
BtnSiguiente = new JButton("Siguiente");
BtnSiguiente.setBounds(430, 330, 80, 20);
BtnSiguiente.addActionListener(this);
BtnAnterior = new JButton("Anterior");
BtnAnterior.setBounds(240, 330, 80, 20);
BtnAnterior.addActionListener(this);

panel2= new JPanel();
panel2.setLayout(null);


//Etiquetas añadidas al panel
panel2.add(etiqNombre);
panel2.add(etiqDireccion);
panel2.add(etiqTelefono);
panel2.add(etiqFNacim);
panel2.add(etiqFInsc);
panel2.add(etiqFVigen);
//Campos de texto añadidos al panel
panel2.add(txtNombre);
panel2.add(txtDireccion);
panel2.add(txtTelefono);
panel2.add(txtBuscar);
//Botones añadidos al panel
panel2.add(BtnGuardar);
panel2.add(BtnNuevo);
panel2.add(BtnEliminar);
panel2.add(BtnBuscar);
panel2.add(BtnSiguiente);
panel2.add(BtnAnterior);
//Listas desplegables añadidas al panel
panel2.add(Mes2);
panel2.add(Dia2);
panel2.add(Año2);
panel2.add(Mes2);
panel2.add(Dia2);
panel2.add(Año2);

setTitle("                                                                                              Usuarios");
add(panel2);
setSize(1000, 400);
setVisible(false);
}





public void actionPerformed(ActionEvent e) {
if(e.getSource()==BtnAnterior) {

library.panel.setVisible(false);
panel2.setVisible(true);
library.add(panel2);
library.validate();
}


}

}

« Última modificación: 12 de Enero 2022, 20:50 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 866
    • Ver Perfil
Re: Invocacion de un panel a otro con JPanel y JFrame en JAVA
« Respuesta #1 en: 17 de Mayo 2021, 00:06 »
Hola.

Toda aplicación Swing debería tener SOLO UN JFrame.

Solo uno. Dentro de este marco, usando los Layout adecuados, se pueden ir mostrando los paneles que requiera nuestra aplicación.

En el caso que propones, usar un CardLayout parece lo más adecuado.
Este layout lo que hace es contener varios paneles JPanel en uno, de manera que solo se muestra el que "está encima" de los otros.
Luego ya con botones o lo que sea, podemos decidir cuál es el panel que se ha de poner "encima" del resto en cada momento.

Para facilitar esto, lo ideal sería que tus clases PanelBiblioteca y PanelUsuario no hereden de JFrame, sino de JPanel.
Es decir, que realmente sean paneles y no marcos JFrame.

Hago un ejemplo muy simplificado, para que puedas probarlo y mirar de adaptarlo a tu programa.
Esto es PanelBiblioteca:

Código: [Seleccionar]
public class PanelBiblioteca extends JPanel{

public PanelBiblioteca() {

add(new JLabel("Este es el panel BIBLIOTECA"));

}

}

Y esto PanelUsuario:
Código: [Seleccionar]
public class PanelUsuario extends JPanel{

public PanelUsuario() {

add(new JLabel("Este es el panel USUARIO"));
}

}

A continuación pondré la clase principal, que es la única que va a heredar de JFrame.

Tendrá como atributos los dos paneles anteriores y un tercer JPanel que será el "principal", es decir, será quien contenga los otros dos paneles.
Le asignaremos el CardLayout, para que el panel "principal" sepa que la forma de gestionar esos dos paneles será mostrar solo uno de ellos, el otro quedará oculto hasta que se de la orden de intercambiarlos.

Estas ordenes las daremos con dos botones, anterior y siguiente, a quienes les añadiremos un ActionListener que se dedicará específicamente a decirle al CardLayout que panel se ha de mostrar, según el botón que se pulse.

En lo que respecta al JFrame, le vamos a dar un BorderLayout.
Este layout lo que hace es dividir el marco en 5 secciones. Una grande en el centro (CENTER) y 4 más pequeñas alrededor del centro (NORTH, SOUTH, EAST, WEST).
En cada sección podemos poner paneles.

Así, en el CENTER pondremos el panel "principal", el que contiene los paneles "biblioteca" y "usuario".
En el SOUTH, pondremos otro panel con los dos botones de "anterior" y "siguiente"

Código: [Seleccionar]
public class EjemploCard extends JFrame{

private PanelBiblioteca pnBiblioteca;
private PanelUsuario pnUsuario;
private JPanel pnPrincipal;
private CardLayout gestorPaneles;
private JButton anterior;
private JButton siguiente;

public EjemploCard() {

//Inicializacion paneles
pnBiblioteca = new PanelBiblioteca();
pnUsuario = new PanelUsuario();
pnPrincipal = new JPanel();
gestorPaneles = new CardLayout();
//Asignamos gestor al panel principal
pnPrincipal.setLayout(gestorPaneles);
//Le añadimos los otros paneles, dándoles un nombre identificador
pnPrincipal.add(pnBiblioteca, "biblioteca");
pnPrincipal.add(pnUsuario, "usuario");

//Inicialización botones
anterior = new JButton("Anterior");
anterior.setEnabled(false);
siguiente = new JButton("Siguiente");
//Accion para los botones
anterior.addActionListener(new AccionAlternaPanel());
siguiente.addActionListener(new AccionAlternaPanel());
//Panel para botones
JPanel pnBotones = new JPanel();
pnBotones.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 10));
pnBotones.add(anterior);
pnBotones.add(siguiente);
pnBotones.setBorder(BorderFactory.createRaisedSoftBevelBorder());

//Configuracion JFrame
setLayout(new BorderLayout());
add(pnPrincipal, BorderLayout.CENTER);
add(pnBotones, BorderLayout.SOUTH);

setTitle("Ejemplo CardLayout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
setVisible(true);

}

//Clase ActionListener para los botones que alternan los paneles
private class AccionAlternaPanel implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton boton = (JButton) e.getSource();
//Según el botón, pedimos al CardLayout que muestre un panel u otro
if (boton.equals(anterior)) {
gestorPaneles.show(pnPrincipal, "biblioteca");
anterior.setEnabled(false);
siguiente.setEnabled(true);
}
else { //Boton siguiente
gestorPaneles.show(pnPrincipal, "usuario");
anterior.setEnabled(true);
siguiente.setEnabled(false);
}
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new EjemploCard();
}
});
}

}

Si pruebas este código verás, que con solo un JFrame, se puede alternar entre dos paneles. De hecho, podríamos alternar con tantos paneles como necesitásemos.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Re: Invocacion de un panel a otro con JPanel y JFrame en JAVA
« Respuesta #2 en: 24 de Mayo 2021, 17:51 »
Muchas gracias moderador de verdad me sirvió bastante el ejemplo y si pude enlazar todo  :D

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".