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.
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
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