Swing | Przełączanie między zbiorami komponentów

0

Otóż mam aplikację w Swingu z paroma komponentami w głównym oknie, między innymi przyciskiem. Wszystko to mieści się w jednej klasie powiedzmy View1.
Chciałbym stworzyć kolejną klasę View2, która "przejmowała by kontrolę nad oknem programu" rysując swój zbiór komponentów.
Całość wyglądałaby następująco: po kliknięciu na przycisk z View1 wszystkie elementy stworzone przez nia są usuwane/chowane/cokolwiek(łącznie z samym przyciskiem) następnie inicjalizowana jest klasa View2 razem z nowymi komponentami tej klasy.
Próbowałem użyć metody removeAll() oraz remove(Components cmp) dla każdego z osobna a następnie repaint() lecz interfejs się wiesza.

Jeśli wrzuciłby ktoś przykładowy kod rozwiązujący ten problem byłbym bardzo wdzięczny.
Pozdrawiam.

0

Spróbuj CardLayout

0

A co jeśli Twoje View odziedziczy po JComponent i zrobisz setVisible(false) ? :>

0

Mam ten sam problem próbuje zrobić w actionPerformed

getContentPane().removeAll();
        getContentPane().add(new TestPanel()).setVisible(true);
        validate();
        repaint(); 

Ramka się czyści ale nie dodaje Panelu : (

0

@autor
Czy ty aby nie próbujesz usunąć komponentów wśród których jest button z którego obsługi próbujesz to zrobić?
Bo na mój gust to wygląda tak jak próba wyrwania sobie spod nóg chodniczka, albo podcięcie gałęzi na której się siedzi. Rzadko kiedy się udaje, ale jak się uda, to sklepujesz sobie miskę.

0

Nie no, jak kliknę button ma się usunąć i ma wejść do ramki zupełnie nowy panel. Więc jest spoko, buttony sie usuwają a Panela niet

0

W dalszym ciągu myślę, że CardLayout byłby dobrym zastosowaniem dla tego problemu ;)

http://java.about.com/od/Layout_Managers/ss/Cardlayout-Example-Program.htm

No to przecież robisz to co napisal Olamagato, usuwasz buttona który usuwa reszte też : P

0

Witam kolegów, jestem w świecie Javy dopiero tydzień ale chyba mogę wam pomóc gdyż to był pierwszy problem podczas pisania mojej aplikacji.
Jeśli chodzi o usuwanie komponentów a potem nałożenie nowych IMHO nie wyjdzie. To tak jakbyś odciął gałąź na której siedzisz, a potem po tej nie istniejącej gałęzi chcesz zejść z drzewa. Gdy wywołujesz metodę/funkcje po jej zakończeniu program wraca do miejsca z ktorego została wywołana a nie mógłby wrócić bo by już jej nie było.

Moje rozwiązanie jest następujące(pokaże na przykładzie apletu, formularze/widoki aplikacji są utożsamione z komponentem JPanel):
Mamy sobie klasę główną a w niej :

 
class TestApp extends JApplet
{
     public JPanel Panel1;//Nasz pierwszy formularz w którym definiujemy wszystkie Buttony, Labele i całą resztę
     public JPanel Panel2;//drugi i jak powyżej, to nasze kolejne okno aplikacji

     public void init()
     {
         // Tworząc obiekty naszych "okienek" dajemy w parametrze konstruktora referencje do obiektu "ojca" aplikacji  żebyśmy mogli się
         // w Panelu odwołać do metod głównej aplikacji a także innych paneli(okienek) aplikacji.
          Panel1 = new JPanel(this);
          add(Panel1);
          Panel2 = new JPanel(this);
         //Dodajemy wszystkie panele do głównego okna ale widoczny będzie tylko ten dodany jako ostatni
          add(Panel2);
     }
     public void paint(Graphics g)
     {
          super.paint(g);//należy wywołać metodę paint klasy dziedziczonej ponieważ po uruchomieniu aplikacji mogą nie zostać odrysowane komponenty
     }
}

Teraz przyszedl na kod Paneli:
Panel1:

class Panel1 extends JPanel
{
     public TestApp parent; // zmienna ta przechowuje referencje do klasy w której został utworzony obiekt
     public Panel1( TestApp parent)
     {
          this.parent = parent;// przekazanie referencji z parametru do zmiennej w klasie
     }
}
 

Panel2:

class Panel2 extends JPanel
{
     public TestApp parent; // zmienna ta przechowuje referencje do klasy w której został utworzony obiekt
     public Panel2( TestApp parent)
     {
          this.parent = parent;// przekazanie referencji z parametru do zmiennej w klasie
     }
}
 

Teraz najważniejsza część, zmieniamy widoczny Paneli, w tym przykładzie kod umieszczamy w np. w akcji Buttona Panel2:
Czyli naciskami przycisk w Panel2 w wykonujemy kod:

 
setVisible(false);//ustawiamy widoczność bieżącego Panel2 na false(jak pamiętamy był dodany jako ostatni i on jest widoczny)
parent.Panel1.setVisible(true);//ustawiamy widoczność Panel1 na true(mimo jest jest w tej chwili na true to przy kolejnej zmianie byłby false)
parent.setContentPane(parent.Panel1);// teraz w głównej klasie ustawiamy komponent Panel1.

I to wszystko, mam nadzieję że komuś pomogłem.:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1