| |||
Cambiar JPanel desde menú JFrame Hola a todos, tal y como indico en el título quiero saber cual es la forma correcta de mostrar distintos JPanel en un JFrame. Estos JPanel están en clases independientes y se deben cargar al seleccionar la opción en el menú. |
| |||
Respuesta: Cambiar JPanel desde menú JFrame Estoy probando con una Ventana sencilla y este es el código Cita: package pruebas; import java.awt.BorderLayout; public class Principal extends JFrame { private JPanel contentPane; static Principal frame; Panel_1 panel_1 = new Panel_1(); Panel_2 panel_2 = new Panel_2(); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { frame = new Principal(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public Principal() { setTitle("Ventana Principal"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu mnNewMenu = new JMenu("Panel"); menuBar.add(mnNewMenu); JMenuItem mntmPanel = new JMenuItem("Panel 1"); mntmPanel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { frame.getContentPane().remove(panel_2); frame.getContentPane().add(panel_1); frame.repaint(); } }); mnNewMenu.add(mntmPanel); JMenuItem mntmPanel_1 = new JMenuItem("Panel 2"); mntmPanel_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.getContentPane().remove(panel_1); frame.getContentPane().add(panel_2); frame.repaint(); } }); mnNewMenu.add(mntmPanel_1); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); } } |
| |||
Respuesta: Cambiar JPanel desde menú JFrame para la pantalla principal usa el JFrame que es quien debe contenes el metido main, y en ves de jpanel para las clase que se deben instanciar dentro de esta usa JInternalFrame ya que este aunque es un Container tiene comportamientos de Window y lo puedes cerrar en vez de remover. Cuando instancias un JPanel este no posee un método dispose(), por lo que solo se oculta pero continua en memoria y llegado el momento llenaras la memoria de pantallas ocultas, en cambio JInternalFrame como tiene comportamiento de Windows posee método dispose(), lo cual al cerrar la pantalla la pasa al Garbage Collector de JVM y mantienes la memoria con un uso adecuado… Saludos y espero te funcione. |
Etiquetas: |