web-dev-qa-db-fra.com

Création d'une liste / collection observable

J'essaie de créer un ChoiceBox dans JavaFX 8, ce qui nécessite un Collection. Je ne sais pas comment créer un Collection si ... Si j'essaye:

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

Je reçois une erreur disant que je ne peux pas instancier ObservableList car c'est abstrait. Compréhensible. Si je regarde le doc pour ObservableList je peux voir que SortedList implements ObservableList, mais je ne peux pas faire:

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

Parce qu'il n'y a pas de constructeur applicable. Apparemment, j'ai besoin d'un ObservableList pour passer au SortedList, ce qui est étrange car je ne peux pas créer 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)

Je ne sais pas comment déchiffrer cela. Si j'essaye

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

par désespoir, j'obtiens une erreur encore plus compliquée.

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

ne fonctionne pas non plus. D'une manière ou d'une autre, cela fonctionne (mais utilise apparemment une opération dangereuse):

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

J'ai donc essayé:

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

Mais pas de chance non plus. Je suis super confus, faisant les mêmes choses encore et encore dans une boucle sans fin d'essayer de comprendre cela. La documentation que j'ai trouvée montre des exemples qui n'aident pas, ou aucun exemple. La documentation officielle est également inutile:

Supposons, par exemple, que vous ayez une collection c, qui peut être une liste, un ensemble ou un autre type de collection. Cet idiome crée une nouvelle ArrayList (une implémentation de l'interface List), contenant initialement tous les éléments de c.

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

Donc, pour créer ArrayList, une implémentation de List, j'ai besoin d'avoir un List. la raison pour laquelle je suis allé à la documentation en premier lieu était d'apprendre à faire ce qu'ils supposent avoir. Je suis perdu. Aidez-moi?

27
LilSweden

Utilisez les méthodes d'usine dans FXCollections :

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

L'opération non sûre dans le constructeur de votre boîte de choix est due au fait que vous n'avez pas spécifié le type de la boîte de choix:

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

et l'erreur de SortedList est due au fait qu'aucun constructeur ne prend aucun argument. (Encore une fois, reportez-vous à javadocs .) Il existe deux constructeurs: le plus simple prend une référence à un ObservableList (la liste pour laquelle la liste triée fournira une vue triée). Vous auriez donc besoin de quelque chose comme

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

ou

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