Referencja do obiektu z adnotacją @FXML

Referencja do obiektu z adnotacją @FXML
NA
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:68
0

Zacząłem bawić się JavąFX i mam pewien problem. Mam kilka rozmiarów przechowywanych w modelu jako BooleanProperty, a w widoku jako CheckBoxy. CheckBoxy łączę z odpowiednimi rzeczami (?) z dokumentu .fxml za pomocą Scene Builder'a. Zauważyłem, że nie mogę zrobić tablicy CheckBoxów, np CheckBox sizes[9] (czy coś takiego) i dawać referencję do odpowiedniego elementu w tablicy, tylko trzeba każdy CheckBox osobno. Mimo to, chciałbym mieć rozmiary w jednym miejscu, więc napisałem coś takiego:

Kopiuj
	@FXML
	private CheckBox S;
	@FXML
	private CheckBox M;
	@FXML
	private CheckBox L;
	@FXML
	private CheckBox XL;
	@FXML
	private CheckBox XL2;
	@FXML
	private CheckBox XL3;
	@FXML
	private CheckBox XL4;
	@FXML
	private CheckBox XL5;
	@FXML
	private CheckBox XL6;
	
	private CheckBox[] sizeCheckBoxes = {S, M, L, XL, XL2, XL3, XL4, XL5, XL6};

Niestety, wyskakuje NullPointerException przy czymś takim:

Kopiuj
sizeCheckBoxes[2].setSelection(true)

Nie ma co się dziwić, CB nie zostały zainicjowane. Jednakże nie mogę ich ręcznie zainicjować, gdyż wtedy to już nie będzie połączony obiekt przez SceneBuildera. To właśnie jest mój problem - jak przechowywać sobie rozmiary "w jednym miejscu" (tablica, lista), żeby np. w jednej pętli zrobić dla nich tę samą czynność, jednocześnie nie tracąc referencji z obiektami/rzeczami (?) utworzonymi przez SceneBuildera?

edytowany 1x, ostatnio: Naitoreivun
Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
1

Spróbuj tą tablicę inicjalizować w start(), konstruktorze, init() czy co ty tam masz w tej klasie.

edytowany 1x, ostatnio: Wizzie
NA
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:68
0

Działa, dziękuję bardzo. Przy okazji jeszcze jedno pytanie. Deklarując wcześniej tablicę nie mogłem zrobić czegoś takiego potem w metodzie:
sizeCheckBoxes = {S, M, L, XL, XL2, XL3, XL4, XL5, XL6}; bo tak można tylko na samym początku.

Obszedłem to w ten sposób:
CheckBox[] temp = {S, M, L, XL, XL2, XL3, XL4, XL5, XL6}; sizeCheckBoxes = temp;

Mam pytanie czy jest jakaś metoda, która przyjmuje kilka parametrów Object i tworzy z nich tablicę czy coś takiego?

K2
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:12
1

Nie wiem czy dobrze Ciebie zrozumiałem...

Kopiuj
new <typ>[] {argumenty inicjalizacji};
Kopiuj
sizeCheckBoxes  = new CheckBox[] {S, M, L, XL, XL2, XL3, XL4, XL5, XL6};

Podstawy http://naukajavy.pl/kurs-jezyka-java/76-tworzenie-obiektow

edytowany 3x, ostatnio: K2op
Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
0

Użyj kolekcji zamiast tablic.

NA
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:68
0

@K2op - Dokładnie o to mi chodziło. Przy okazji wychodzi ile jest braków w podstawach D:
@Wizzie - akurat w tym wypadku wygodniej było mi użyć tablic, gdyż mała szansa, aby się wielkości zmieniły, ale następnym razem wezmę to pod uwagę :)

Dziękuję bardzo za pomoc.

Wizzie
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
0

akurat w tym wypadku wygodniej było mi użyć tablic, gdyż mała szansa, aby się wielkości zmieniły, ale następnym razem wezmę to pod uwagę

Ale co jest w tym wygodniejszego? Taka sama robota przy inicjalizacji jak z tablicą, a kolekcje są prawie zawsze znacznie lepszym wyborem z powodów, których nie będę wymieniał, bo możesz sobie łatwo je znaleźć w google (albo Effective Java, polecam). Generalnie używaj kolekcji zamiast tablic kiedy możesz.

Ogólnie IMO jeszcze lepszym rozwiązaniem jest klasa opakowująca te checkboxy, ale jeśli dopiero uczysz się podstaw, to możesz to póki co olać.

NA
Zamiast get(i) mam [i] - chyba w sumie tyle; podstaw JavyFX tak, ale samej Javy nie, tak bardzo więc wszelkie uwagi tego typu bardzo chętnie przeczytam; hmmm, ale co tu da opakowanie tych CheckBoxów? bo rozumiem, że nie chodzi Ci o rozszerzenie klasy CheckBox, co nic nie da, bo np. klasy MyCheckBox extends CheckBox nie da się połączyć przez SceneBuildera (nie wiem w sumie czemu).
Wizzie
Chodzi mi o zrobienie klasy np. Checkboxes, w której będą się znajdować te prywatne pola z checkobaxami i metody publiczne, którymi będziesz na nich operować. To tylko propozycja, guru nie jestem

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.