Crearea unei liste/colecții observabile (Programare, Java, Lista, Colecții, Interfață, Javafx)

LilSweden a intrebat.

Încerc să creez un ChoiceBox în JavaFX 8, care necesită o Collection. Nu-mi dau seama cum să creez o Collection deși… Dacă încerc:

 ObservableList<String> list = new ObservableList<String>();

Primesc o eroare care spune că nu pot să instanțez ObservableList pentru că este abstract. Este de înțeles. Dacă mă uit la documentul pentru ObservableList pot vedea că SortedList implements ObservableList, , dar nu pot să fac:

 ObservableList<String> list = new SortedList<String>();

Pentru că nu există un constructor aplicabil. Se pare că trebuie să am un ObservableList pe care să îl trec la SortedList, , ceea ce este ciudat pentru că nu pot crea un ObservableList.

constructor SortedList.SortedList(ObservableList<? extends String>,Comparator<? super String>) is not applicable
  (actual and formal argument lists differ in length)
constructor SortedList.SortedList(ObservableList<? extends String>) is not applicable
  (actual and formal argument lists differ in length)

Nu sunt sigur cum să descifrez asta. Dacă încerc

 ObservableList<String> list = new SortedList<SortedList<String>>();
 //or
 ObservableList<String> list = new SortedList<ObservableList<String>>();

din disperare, primesc o eroare și mai complicată.

    SortedList<String> list = new SortedList<String>();

nu funcționează nici el. Cumva asta funcționează (dar se pare că folosește o operațiune nesigură):

ChoiceBox box = new ChoiceBox(FXCollections.observableArrayList("Asparagus", "Beans", "Broccoli", "Cabbage" , "Carrot", "Celery", "Cucumber", "Leek", "Mushroom" , "Pepper", "Radish", "Shallot", "Spinach", "Swede" , "Turnip"));

Așa că am încercat:

 ObservableList<string> list = new FXCollections.observableArrayList("Asparagus", "Beans", "Broccoli", "Cabbage" , "Carrot", "Celery", "Cucumber", "Leek", "Mushroom" , "Pepper", "Radish", "Shallot", "Spinach", "Swede" , "Turnip");

Dar nici aici nu am avut noroc. Sunt super confuz, făcând aceleași lucruri din nou și din nou într-o buclă nesfârșită în încercarea de a înțelege acest lucru. Documentația pe care am găsit-o prezintă exemple care nu ajută sau nu prezintă niciun exemplu. Documentația oficială este și ea inutilă:

Să presupunem, de exemplu, că aveți o colecție c, care poate fi o listă, un set sau un alt tip de colecție. Acest idiom creează un nou ArrayList (o implementare a interfeței List), care conține inițial toate elementele din c.

 List<String> list = new ArrayList<String>(c);

Astfel, pentru a crea ArrayList, , o implementare a interfeței List, , trebuie să am un List. motivul pentru care m-am dus la documentație în primul rând a fost să învăț cum să fac ceea ce ei presupun că am. M-am pierdut. Ajutor?

1 răspunsuri
James_D

Folosiți metodele de fabrică din FXCollections:

ObservableList<String> list = FXCollections.observableArrayList();

Operațiunea nesigură din constructorul căsuței de alegere se datorează faptului că nu ați specificat tipul pentru căsuța de alegere:

ChoiceBox<String> box = new ChoiceBox<>(FXCollections.observableArrayList("Asparagus", "Beans", "Broccoli", "Cabbage" , "Carrot", "Celery", "Cucumber", "Leek", "Mushroom" , "Pepper", "Radish", "Shallot", "Spinach", "Swede" , "Turnip"));

iar eroarea din SortedList se datorează faptului că nu există un constructor care să nu primească argumente. (Din nou, consultați javadocs.) Există doi constructori: cel mai simplu ia o referință la un fișier ObservableList (lista pentru care lista sortată va furniza o vizualizare sortată). Așadar, aveți nevoie de ceva de genul

SortedList<String> sortedList = new SortedList<>(list);

sau

SortedList<String> sortedList = new SortedList<>(FXCollections.observableArrayList());

Comentarii

  • Am crezut că am încercat observableArrayList, dar se pare că nu. Vă mulțumim! –  > Por LilSweden.