Swing, JPanel - podmiana panelu

Odpowiedz Nowy wątek
2011-08-01 20:15
0

Witam,
klikam sobie GUI w Netbeans7 i mam coś takiego jak w załączniku.

  • Ten prostokąt zaznaczony na pomarańczowo to zmienna "ustawieniaPanel" typu JPanel.
  • Po lewej mam listę typu JList w której są kolejno takie elementy jak "Dno ostatniego objęcia", "Harami", ...
  • Patrząc na moje pliki w drzewie projektu są tam właśnie takie klasy jak DnoOstatniegoObjecia.java, Harami.java, ... Klasy te dziedziczą po JPanel.

Co chcę zrobić:
Chcę aby po kliknięciu w liście JList np. na "Harami" panel ustawieniaPanel podmienił się na panel Harami itd.
Próbowałem przypisywać pod zmienną ustawieniaPanel inny panel ale to nic nie daje (w gui się nic nie zmienia). Jak to się powinno zrobić aby działało?

edytowany 1x, ostatnio: rzezbi, 2011-08-01 20:25

Pozostało 580 znaków

2011-08-01 21:05
bo
0

W skrócie

remove(oldPanel);
add(newPanel);
validate();
repaint();

Pozostało 580 znaków

2011-08-01 22:34
0

a nie na się tego zrobić bez usuwania tego panelu? Nie wystarczyło by podmienić referencje i jakoś odświeżyć?

Pozostało 580 znaków

2011-08-01 22:40
0

a dlaczego nie chcesz usuwać poprzedniego panelu? przecież jak go podmienisz i nie usuniesz to będzie ci niepotrzebnie zaśmiecał pamięć.

Pozostało 580 znaków

2011-08-01 22:46
bo
0

Ten usunięty panel istnieje, tylko go nie widać. Możesz go potem przywrócić. remove(panel) usuwa panel z okna (robi go niewidocznym), ale w pamięci on zostaje.
Tak naprawdę, to jest podmiana referencji do panelu na liście komponentów okna.

Pozostało 580 znaków

2011-08-01 23:10
0
remigio napisał(a)

a dlaczego nie chcesz usuwać poprzedniego panelu? przecież jak go podmienisz i nie usuniesz to będzie ci niepotrzebnie zaśmiecał pamięć.

bo dużo prościej byłoby dla mnie po prostu przypisać inną zmienną i jakoś odświeżyć niż usuwać i dodawać komponenty. Wszystko dlatego, że GUI sobie "wyklikałem" w netbeans'ie i on wygenerował jakiś skomplikowany kod. Dodawanie tego panelu wygląda tak:
(w poniższym kodzie dodawany jest panel "newPanel"):

 
GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
    jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
    .addGroup(jPanel1Layout.createSequentialGroup()
    .addComponent(jScrollPane1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(newPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
    jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
    .addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 356, Short.MAX_VALUE)
    .addComponent(newPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);      

czy da się dodać ten panel w jakiś prostszy sposób?

Pozostało 580 znaków

2011-08-02 08:07
0

ja się tutaj pomyliłem troszkę....tak jak napisał @bo . Ten panel nie znika z pamięci...Także spokojnie możesz operować tą zmienną mimo że usuwasz panel w którym jej użyłeś.

Co do skomplikowanego kodu wyrzucanego przez kreatora...
Moim zdaniem jeżeli w oknie nie masz jakieś dużej ilości komponentów to zawsze lepiej jest napisać ten kod samemu.

Moim zdaniem, zawsze lepiej jest napisać kod samemu. A jeżeli chcemy dynamicznie zmieniać wygląd (podmieniać panele, dodawać i usuwać komponenty,..), to "klikanego" designera należy wyrzucić przez okno. - bogdans 2011-08-02 09:28

Pozostało 580 znaków

2011-08-02 14:26
0

CardLayout :p
http://download.oracle.com/ja[...]rial/uiswing/layout/card.html
http://download.oracle.com/ja[...]rc/layout/CardLayoutDemo.java

Trochę w kodzie musisz i tak pogrzebać

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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