Czytanie panelu do układu po edycji panelu?

Próbuję dynamicznie edytować panel i wczytać go do układu (Border). Panel zawiera pola tekstowe i chcę, aby użytkownik mógł dodawać lub usuwać pola tekstowe do panelu. Próbowałem wykonać następujące czynności: usuń panel z układu, dodaj kolejne pole tekstowe do panelu, wczytaj panel do układu. Jednak to nie działa (nic się nie stało; tylko panel został usunięty, ale nie został odczytany z nowym polem tekstowym, więc obszar był po prostu pusty). Nawet gdy usunąłem panel z układu, a następnie dodałem inny komponent do układu w tej pozycji (BorderLayout.EAST); nic się nie stało (po prostu pusto).

To jest część kodu, która nie działa:

vfields[blocks] = new TextField("0"); //add new textfield to the array of textfields
blocks    += 1;
dp.blocks = blocks;
this.remove(values_fields); //remove the values_fields panel from the borderlayout
values_fields.add(vfields[blocks]); //add new component,textfield to the panel
this.add(values_fields, BorderLayout.EAST); //readd the panel to the border layout<-- doesn't work

Mam nadzieję, że ktoś będzie mógł mi pomóc. Jestem stosunkowo nowy w Javie, więc mogę po prostu robić coś całkowicie złego lub coś takiego, ale sam tego nie widzę.

Z góry dziękuję!

Skyfe.


person Skyfe    schedule 30.10.2010    source źródło


Odpowiedzi (2)


Nie ma potrzeby demontażu całego panelu. Możesz po prostu usunąć/dodać komponenty do istniejącego panelu. W widocznym GUI kolejność kodu będzie następująca:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();

Jeśli potrzebujesz dodatkowej pomocy, opublikuj swoje SSCCE.

person camickr    schedule 30.10.2010
comment
Cześć, wypróbowałem to i zadziałało w przypadku usuwania komponentów z panelu. Jednak gdy próbuję dynamicznie dodawać komponenty do panelu w ten sposób, nie działa to. Działa: wartości_pola.remove(vfields[blocks-1]); wartości_pola.validate(); wartości_pola.repaint(); Nie działa: wartości_pola.add(vpola[bloki]); wartości_pola.validate(); wartości_pola.repaint(); - person Skyfe; 31.10.2010
comment
Aktualizacja: Wydaje mi się, że otrzymuję wyjątek Java NullPointerException w części, w której używam metody dodawania: wartości_pola.add(vfields[bloki]). Co jest nie tak? - person Skyfe; 31.10.2010
comment
Jeśli to nie zadziała po dodaniu komponentów, prawdopodobnie jest to spowodowane tym, że używasz menedżera układu, który wymaga określenia ograniczeń. Stanie się tak na przykład, gdy użyjesz IDE do utworzenia formularza. Większość IDE korzysta z GroupLayout, co wymaga określenia kilku ograniczeń. Moja rada to zrzucić IDE i samodzielnie zakodować formularze, aby wiedzieć, jak dodawać komponenty i jak określić wymagane ograniczenia. - person camickr; 31.10.2010
comment
Dziękuję za odpowiedź, już działam; używając Twoich metod. Zrobiłem jakiś głupi błąd: odniosłem się do utworzonego obiektu ( vfields[blocks] ) w taki sam sposób, w jaki go utworzyłem (używając również wartości bloków jako indeksu), ale pomiędzy utworzeniem obiektu a użyciem go zwiększyłem wartość bloki, które sprawiły, że odnosiło się to do jeszcze nieistniejącego obiektu, więc przeniosłem zwiększanie bloków int na po nim i teraz działa. Wielkie dzięki! - person Skyfe; 31.10.2010

Wygląda na to, że nie będzie już ponownie malowany. Czy próbowałeś wywołać następujące dwie metody po zmianach GUI:

  validate();
  repaint();
person Prine    schedule 30.10.2010
comment
Tak, kiedy wywołuję te metody po zmianach GUI, nadal nic nie pokazuje. To tak, jakby usunął tylko pola wartości panelu z układu obramowania, ponieważ w tym miejscu nadal jest pusty. Dowolny pomysł? - person Skyfe; 30.10.2010