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