2011-11-23 64 views
5

Actualmente tengo un SwingWorker que envía una solicitud HTTP y anulo el método done() de SwingWorker para cambiar los contenidos en un JFrame. Quiero básicamente eliminar todo y agregar un nuevo panel de miembros en el JFrame en función de los valores devueltos por el servidor.JFrame eliminar JPanels y agregar un nuevo JPanel

Ahora, el problema al que me enfrento es que cuando invoco los siguientes métodos a continuación en el JFrame, no elimina nada del JFrame ni cambia su contenido dentro del Marco.

//TODO: Investigate why JFrame content pane won't repaint. 
f.removeAll(); 
//Pass the frame f reference only into MainDisplay, it doesn't actually do anything apart from allowing a class to add a JMenuBar on the JFrame. 
f.add(new MainDisplay(f)); 
f.getContentPane().invalidate(); 
f.getContentPane().validate(); 
f.getContentPane().repaint(); 

La solución actual que tengo es esto más adelante, pero yo prefiero cambiar el contenido del JFrame en vez de cargar un nuevo uno.

f.dispose(); 
f=new ApplicationFrame(); 

He mirado a través de las respuestas anteriores de aquí y en Google y un cierto uso de validación de estado() o invalidar(), mientras que llamar a repaint() para volver a pintar el JFrame.

Cualquier sugerencia/ayuda sería muy apreciada.

Editar: Creo que voy a depurar más ya que debe haber algo más que va mal.

+0

¿Alguien sabe si el uso de eliminar o eliminarTodo elimina la memoria real ubicada para el Panel/Paneles en un Marco? ¿o simplemente lo elimina del cuadro? – unleashed

+0

Simplemente elimina los componentes del marco. Depende del recolector de basura de JVM "eliminar" la memoria ... o más bien desasignar la memoria. El GC no garantiza que esto ocurra durante la vida útil de su programa. Además, si los componentes que se eliminaron se mencionan en otro lugar en el programa, entonces no se GC'd (excepto en circunstancias especiales con referencias débiles). – Jason

Respuesta

8

por ejemplo

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MyFrame extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public MyFrame() { 
     final JPanel parentPanel = new JPanel(); 
     parentPanel.setLayout(new BorderLayout(10, 10)); 

     final JPanel childPanel1 = new JPanel(); 
     childPanel1.setBackground(Color.red); 
     childPanel1.setPreferredSize(new Dimension(300, 40)); 

     final JPanel childPanel2 = new JPanel(); 
     childPanel2.setBackground(Color.blue); 
     childPanel2.setPreferredSize(new Dimension(800, 600)); 

     JButton myButton = new JButton("Add Component "); 
     myButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       parentPanel.remove(childPanel1); 
       parentPanel.add(childPanel2, BorderLayout.CENTER); 
       parentPanel.revalidate(); 
       parentPanel.repaint(); 
       pack(); 
      } 
     }); 
     setTitle("My Empty Frame"); 
     setLocation(10, 200); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     parentPanel.add(childPanel1, BorderLayout.CENTER); 
     parentPanel.add(myButton, BorderLayout.SOUTH); 
     add(parentPanel); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MyFrame myFrame = new MyFrame(); 
      } 
     }); 
    } 
} 
1

Usted está tratando de repaint()/validate() la ContentPane. ¿Intentó hacer lo mismo en el JFrame? También puedes probar JFrame#pack().

1

modificación de su código

f.setContentPane(new MainDisplay(f)); 
f.getContentPane().invalidate(); 
f.getContentPane().validate(); 
f.getContentPane().repaint(); 
+2

Hi isograph La diferencia entre el código que ha publicado aquí y el código que ha modificado es solo la línea 'f.removeAll()'. Si cree que esto marca una diferencia significativa en el código, considere expandir su respuesta para explicar por qué. Si acabas de eliminar esa línea porque es innecesaria, quizás dejes un comentario a la pregunta. Las respuestas deben proponer soluciones a la pregunta. Los comentarios son más apropiados para sugerir mejoras a las preguntas u otras respuestas. – Crippledsmurf

0

Usted puede tratar de usar Frame.pack() nuevo que trabajó para mí. O pruebe uno de esos métodos siguientes:

Frame.setOpaque(false); 
Frame.setEnabled(false); 
Frame.setVisible(false); 
Frame.removeAll(); 
+0

Espero que ayude a alguien, fue útil para mí ese momento – AXL

Cuestiones relacionadas