2011-11-23 12 views
5

Mam obecnie SwingWorker, który wysyła żądanie HTTP i nadpisuję metodę done() SwingWorker, aby zmienić zawartość w JFrame. Chcę zasadniczo usunąć wszystko i dodać nowy panel członków w JFrame w zależności od wartości zwróconych z serwera.JFrame usuwanie JPanels i dodawanie nowego JPanel

Problem, przed którym stoję, polega na tym, że kiedy przywołuję następujące metody na JFrame, to nie usuwa ono niczego z JFrame ani nie zmienia jego zawartości zawartej w Ramce.

//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(); 

Obecny dylemat mam jest to poniżej, ale wolałbym zmienić zawartość JFrame a następnie załadowanie nowego jedną.

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

Przejrzałem poprzednich odpowiedzi na ten temat tutaj i na google i pewnego użytkowania państwowej validate() lub unieważnić(), podczas gdy wywołanie repaint() przemalować JFrame.

Wszelkie sugestie/pomoc będą mile widziane.

Edycja: Myślę, że będę debugować więcej, ponieważ musi coś jeszcze pójść nie tak.

+0

Czy ktoś wie, czy przy użyciu polecenia remove lub removeAll usuwa rzeczywistą pamięć dla panelu/paneli na ramce? czy po prostu usuwa je z ramki? – unleashed

+0

Po prostu usuwa komponenty z ramki. Od pojemnika na śmieci JVM zależy "usunięcie" pamięci ... lub raczej zwolnienie pamięci. GC nie gwarantuje, że stanie się to przez cały okres życia twojego programu. Ponadto, jeśli usuwane komponenty są przywoływane w innym miejscu w programie, nie będą one GCd (z wyjątkiem szczególnych okoliczności używających słabych odniesień). – Jason

Odpowiedz

8

np

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

Próbujesz repaint()/validate() ContentPane. Czy próbowałeś zrobić to samo na JFrame? Możesz także wypróbować JFrame#pack().

1

modyfikacja kodu

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

Witam isograph Różnica między kodem, który tu zamieściłeś, a zmodyfikowanym kodem, to tylko wiersz 'f.removeAll()'. Jeśli uważasz, że ma to znaczący wpływ na kod, rozważ rozszerzenie odpowiedzi, aby wyjaśnić, dlaczego tak się dzieje. Jeśli po prostu usunąłeś tę linię, ponieważ jest to niepotrzebne, może zamiast tego pozostaw komentarz do pytania. Odpowiedzi powinny proponować rozwiązania tego problemu. Komentarze są bardziej odpowiednie do sugerowania ulepszeń pytań lub innych odpowiedzi. – Crippledsmurf

0

może spróbować użyć Frame.pack() ponownie pracował dla mnie. Lub wypróbuj jedną z następujących metod:

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

Mam nadzieję, że komuś pomogło, przydało mi się to – AXL