创建可观察列表/集合

时间:2014-10-04 17:23:49

标签: java list collections interface javafx

我试图在JavaFX 8中创建ChoiceBox,这需要Collection。我无法弄清楚如何创建Collection ...如果我尝试:

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

我收到一条错误消息,说我无法实例ObservableList,因为它是抽象的。可以理解的。如果我查看ObservableList的文档,我可以看到SortedList implements ObservableList,但我无法做到:

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

因为没有适用的构造函数。显然我需要ObservableList传递给SortedList,这很奇怪,因为我无法创建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)

我不确定如何解读。如果我试试

 ObservableList<String> list = new SortedList<SortedList<String>>();
 //or
 ObservableList<String> list = new SortedList<ObservableList<String>>();
出于绝望,我得到了一个更复杂的错误。

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

也不起作用。不知怎的,这有效(但显然使用了不安全的操作):

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

所以我试过了:

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

但也没有运气。我非常困惑,在无休止的循环中一遍又一遍地尝试理解这一点。我发现的文档显示的例子没有帮助,也没有示例。官方文档也没用:

  

例如,假设您有一个Collection c,可以   是列表,集合或其他类型的集合。这个成语创造了一个   最初是一个新的ArrayList(List接口的一个实现)   包含c。

中的所有元素
 List<String> list = new ArrayList<String>(c);

因此要创建ArrayList List的实现,我需要List。我之前首先阅读文档的原因是为了学习如何制作他们假设的东西。我输了。帮助

1 个答案:

答案 0 :(得分:44)

使用FXCollections中的工厂方法:

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

您的选择框构造函数中的不安全操作是因为您还没有为选择框指定类型:

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

并且来自SortedList的错误是因为没有构造函数不带参数。 (再次,请参阅javadocs。)有两个构造函数:最简单的构造函数引用ObservableList(排序列表将提供排序视图的列表)。所以你需要像

这样的东西
SortedList<String> sortedList = new SortedList<>(list);

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