2011-11-23 16 views
5

Attualmente ho uno SwingWorker che invia una richiesta HTTP e sostituisco il metodo done() di SwingWorker per modificare i contenuti in una JFrame. Voglio sostanzialmente rimuovere tutto e aggiungere un nuovo pannello membri su JFrame a seconda dei valori restituiti dal server.JFrame rimozione di JPanel e aggiunta di un nuovo JPanel

Ora, il problema che sto affrontando è che quando invoco i seguenti metodi su JFrame, non rimuove nulla da JFrame né cambia i contenuti contenuti nel Frame.

//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 correzione corrente che ho è questo qui sotto ma preferirei cambiare il contenuto del JFrame piuttosto che il caricamento di un nuovo uno.

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

Ho guardato attraverso risposte precedenti su questo sito e su Google e alcuni usano stato validate() o invalidate() mentre chiamando ridipingere() per ridipingere il JFrame.

Qualsiasi suggerimento/aiuto sarebbe molto apprezzato.

Edit: Penso che sto andando a eseguire il debug di più poiché ci deve essere qualcos'altro che va storto.

+0

Qualcuno sa se l'utilizzo di rimuovere o rimuovereTutti rimuove la memoria effettiva situata per Pannelli/Pannelli su una cornice? o lo rimuove dal Frame? – unleashed

+0

Rimuove solo i componenti dal telaio. Spetta al garbage collector JVM "rimuovere" la memoria ... o piuttosto rilasciare la memoria. Il GC non garantisce che ciò accada durante la vita del tuo programma. Inoltre, se i componenti che sono stati rimossi vengono referenziati altrove nel programma, non saranno GC (tranne in circostanze particolari che utilizzano riferimenti deboli). – Jason

risposta

8

ad esempio

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

Si sta tentando di repaint()/validate() il ContentPane. Hai provato a fare lo stesso su JFrame? Puoi anche provare JFrame#pack().

1

modifica del vostro codice di

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

Hi isograph La differenza tra il codice che hai postato qui e il codice che hai modificato è solo la riga 'f.removeAll()'. Se ritieni che ciò faccia una differenza significativa per il codice, ti preghiamo di considerare di espandere la tua risposta per spiegare perché. Se hai appena rimosso quella linea perché non è necessaria, puoi lasciare un commento alla domanda. Le risposte dovrebbero proporre soluzioni alla domanda. I commenti sono più appropriati per suggerire miglioramenti a domande o altre risposte. – Crippledsmurf

0

Si può provare a utilizzare Frame.pack() di nuovo ha funzionato per me. Oppure prova uno dei seguenti metodi:

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

Spero che questo aiuti qualcuno, mi è stato utile quella volta – AXL