Programación General > Java
Problema En Manejo De Varios Jframe
darkness_twilight:
Hola
Tengo un problema con una agenda k estoy empezando a programar, lo que pasa es k este programa empieza mostrando un menu principal con opciones( botones ) como ingresar datos, salir, etc. hasta el momento solo le tengo dos opciones, ingresar datos y salir. Cuando se presiona salir, al JFrame principal le aplico el metodo setvisible( false ); para ocultarlo, e instanciar un nuevo JFrame para el ingreso de datos, todos los JFrame son clases distintas k extienden JFrame obviamente. El problema que tengo es que estando en el JFrame de ingreso de datos, y presionando el boton volver ( lo que cierra el JFrame de ingreso y hace volver al JFrame principal ) no se como hacer para manejar la instancia de la clase JFrame principal para aplicar el metodo setVisible( true ); para volver a mostrarla, podria hacer una nueva instancia de la clase, pero esa no es la idea, la idea es hacer reaparecer el JFrame k esta invisible, espero k puedan ayudarme.
Aqui va el codigo, son tres clases distintas ( en archivos distintos) una en cada archivo:
--- Código: Text --- // Archivo LibretaContactos.java import javax.swing.*; public class LibretaContactos{ public static void main( String args[] ) { MenuPrincipal frame = new MenuPrincipal(); frame.setResizable( false ); frame.setVisible( true ); }} // Archivo MenuPrincipal.java import javax.swing.*;import java.awt.*;import java.awt.event.*; public class MenuPrincipal extends JFrame{ private JButton btnIngresar; private JButton btnSalir; private JLabel lblTitulo; private JLabel lblEstadoServidor; private JPanel panelTitulo; private JPanel panelCentral; private JPanel panelInferior; public MenuPrincipal() { super( " CONTACTOS :: Darkness_Twilight :: " ); inicializarComponentes(); } private void inicializarComponentes() { setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 240, 350 ); setLayout( new BorderLayout( 15, 5 ) ); setLocationRelativeTo( null ); setUndecorated( false ); // JPanel's panelTitulo = new JPanel(); panelTitulo.setBackground( Color.BLUE ); panelCentral = new JPanel(); panelCentral.setBackground( Color.BLUE ); panelInferior = new JPanel(); panelInferior.setBackground( Color.WHITE ); ManejadorBoton handler = new ManejadorBoton(); // JButton's btnIngresar = new JButton( "Ingresa tus datos!!..." ); btnIngresar.setFont( new Font( "Arial", Font.BOLD, 14 ) ); btnIngresar.setForeground( Color.BLACK ); btnIngresar.addActionListener( handler ); btnSalir = new JButton( "Salir" ); btnSalir.setFont( new Font( "Arial", Font.BOLD, 14 ) ); btnSalir.setForeground( Color.BLACK ); btnSalir.addActionListener( handler ); // JLabel's lblTitulo = new JLabel( "Menu Principal" ); lblTitulo.setFont( new Font( "Century Gothic", Font.BOLD, 26 ) ); lblTitulo.setForeground( Color.BLACK ); lblEstadoServidor = new JLabel( "Servidor Desconectado..." ); lblEstadoServidor.setFont( new Font( "SansSerif", Font.BOLD, 16 ) ); lblEstadoServidor.setForeground( Color.RED ); agregarComponentes(); } private class ManejadorBoton implements ActionListener { public void actionPerformed( ActionEvent evento ) { if( evento.getSource() == btnSalir ) System.exit( 0 ); if ( evento.getSource() == btnIngresar ) { setVisible( false ); JFrameIngreso frameIngreso = new JFrameIngreso(); frameIngreso.setVisible( true ); frameIngreso.toFront(); } } } private void agregarComponentes() { panelTitulo.add( lblTitulo ); panelCentral.add( btnIngresar ); panelCentral.add( btnSalir ); panelInferior.add( lblEstadoServidor ); add( panelTitulo, BorderLayout.NORTH ); add( panelCentral, BorderLayout.CENTER ); add( panelInferior, BorderLayout.SOUTH ); }} // Archivo JFrameIngreso.java import javax.swing.*;import java.awt.*;import java.awt.event.*; public class JFrameIngreso extends JFrame{ private JLabel lblTitulo; private JPanel panelCampos, panelBotones, panelNombre, panelApellido, panelCorreo; private JLabel lblNombre, lblApellido, lblFechaNac, lblCorreo, lblFonoFijo, lblFonoMovil; private JTextField txtNombre, txtApellido, txtFechaNac, txtCorreo, txtFonoFijo, txtFonoMovil; private JButton btnIngresar, btnVolver; public JFrameIngreso() { inicializarComponentes(); } private void inicializarComponentes() { inicializarJFrame(); inicializarJPanel(); inicializarJLabel(); inicializarJTextField(); inicializarJButton(); agregarComponentes(); } private void inicializarJFrame() { setVisible( false ); setSize( 250, 250 ); setTitle( "Informacion Contacto" ); setLayout( new BorderLayout( 0, 10 ) ); setLocationRelativeTo( null ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } private void inicializarJLabel() { lblTitulo = new JLabel( "Ingreso de Datos" ); lblTitulo.setFont( new Font( "Chlorinar", Font.BOLD, 24 ) ); lblTitulo.setHorizontalAlignment( SwingConstants.CENTER ); lblNombre = new JLabel( "Nombre: " ); lblNombre.setFont( new Font( "Arial", Font.PLAIN, 12 ) ); lblApellido = new JLabel( "Apellido: " ); lblApellido.setFont( new Font( "Arial", Font.PLAIN, 12 ) ); lblCorreo = new JLabel( "Correo: " ); lblCorreo.setFont( new Font( "Arial", Font.PLAIN, 12 ) ); } private void inicializarJPanel() { panelCampos = new JPanel( new GridLayout( 3, 1 ) ); panelBotones = new JPanel( new FlowLayout( ) ); panelNombre = new JPanel( new FlowLayout( SwingConstants.LEFT ) ); panelApellido = new JPanel( new FlowLayout( SwingConstants.LEFT ) ); panelCorreo = new JPanel( new FlowLayout( SwingConstants.LEFT ) ); } private void inicializarJTextField() { txtNombre = new JTextField(); txtNombre.setColumns( 15 ); txtApellido = new JTextField(); txtApellido.setColumns( 15 ); txtCorreo = new JTextField(); txtCorreo.setColumns( 15 ); } private void inicializarJButton() { ManejadorBoton handler = new ManejadorBoton(); btnIngresar = new JButton( "Ingresar" ); btnIngresar.setFont( new Font( "Monospaced", Font.BOLD, 14 ) ); btnIngresar.setBounds( new Rectangle( 30, 40 )); btnVolver = new JButton( "Volver" ); btnVolver.setFont( new Font( "Monospaced", Font.BOLD, 14 ) ); btnVolver.addActionListener( handler ); } private void agregarComponentes() { panelNombre.add( lblNombre ); panelNombre.add( txtNombre ); panelApellido.add( lblApellido ); panelApellido.add( txtApellido ); panelCorreo.add( lblCorreo ); panelCorreo.add( txtCorreo ); panelCampos.add( panelNombre ); panelCampos.add( panelApellido ); panelCampos.add( panelCorreo ); panelBotones.add( btnIngresar ); panelBotones.add( btnVolver ); add( lblTitulo, BorderLayout.NORTH ); add( panelCampos, BorderLayout.WEST ); add( panelBotones, BorderLayout.SOUTH ); } private class ManejadorBoton implements ActionListener { public void actionPerformed( ActionEvent evento ) { if ( evento.getSource() == btnVolver ) { setVisible( false ); //Aqui quiero volver a mostrar el JFrame MenuPrincipal //con setVisible( true ), pero no se como me puedo referir a el } } }}
Espero su respuesta, o una idea o forma alternativa de hacerlo, la idea es k cada JFrame sea una clase distinta, quiero k sea lo mas modular posible, vale.
hdr:
una solucion puede ser crear una entidad coordinadora que se encargue de todos lo mensajes entre Frames, es decir que ella contendra una instancia de cada frame y los demas pueden acceder a ella, de forma que puede hacer visible o invisible cualquier frame...
darkness_twilight:
Gracias por la respuesta Hernan, voy a probar con la forma que me diste, cualquier cosa te aviso, vale.
darkness_twilight:
Bueno, no me resulto, o no supe aplicar la solucion que me diste. Hice un clase en en donde esta el metodo main, ahi instancio ambos frame. Lo que hice fue hacer un ciclo while( true) infinito, que pregunte todo el tiempo k frame esta visible, pero me resulto muy engorroso. No se si te referias a una clase con lo de entidad coordinadora.
Me puedes explicar mejor como hacer eso de los mensajes entre los JFrames, me seria de mucha utilidad si puedes poner algo de codigo, espero tu respuesta, y gracias por responder.
silverfox:
Hola...
Para que los frames charlen entre ellos, tendrás que tener una referencia de uno al otro, me explico:
O bien tienes una clase que contiene a los 2 JFrame que quieres que se comuniquen y un método de esa clase que resulta en pasar información del uno al otro (es básicamente lo que te comentó hernanvid).
La segunda opción es que tu JFrame principal sea el que construye al otro (como si fuese una ventana modal). Con una referencia del hijo al padre puedes pasarle toda la información que quieras, incluso, ejecutar su método setVisible(true).
Espero que te sirva.
Saludos.
Silverfox
Navegación
[#] Página Siguiente
Ir a la versión completa