我是Java初学者,从各种来源学习Java FX。在我的程序中,我想创建一个ComboBox,并使用ArrayList中一系列对象的toString()输出填充选择。在此,比萨馅料被定义为对象。它们被创建并存储在PizzaMgr对象中,该对象基本上是ArrayList的美化包装器:
public class Topping{
private String name;
public Topping(String a){
this.name=a;
}
public String toString(){
return this.name;
}
}
//=================================================
import java.util.ArrayList;
public class PizzaMgr{
private ArrayList<Topping> OrderedToppings;
public PizzaMgr(){
OrderedToppings = new ArrayList<Topping>();
OrderedToppings.add(new Topping("Pepperoni"));
OrderedToppings.add(new Topping("Mushrooms"));
OrderedToppings.add(new Topping("Onions"));
}
public ArrayList<Topping> getList(){
return OrderedToppings;
}
}
到现在为止还挺好。但是,我遇到的麻烦是当我想要一个ComboBox列出PizzaMgr的ArrayList中的所有这些项目时。理想情况下,我想使用以下ComboBox构造函数:
ComboBox<T>(ObservableList<T> items)
问题?如何将所有ArrayList项目提取到可观察列表中?我一直在阅读Arraylist,Observable List,接口(interface)的一般内容,但是我不知道如何使它起作用。我已经读到ArrayList是一个Collection,而Observable List可以是Collection的接口(interface),所以我以为自己可以自由出入。但是,当我尝试实现ComboBox构造函数时:
import javafx.scene.control.*;
public class Menu{
public static void main(String[] args){
PizzaMgr m = new PizzaMgr();
ComboBox<Topping> topMenu = new ComboBox<Topping>(m.getList());
}
}
我收到编译器错误:
Menu.java:18: error: incompatible types: ArrayList<Topping> cannot be converted to ObservableList<Topping>
ComboBox<Topping> topMenu = new ComboBox<Topping>(m.getList());
^
因此,显然我的ArrayList未被视为可观察列表。
让我感到困扰的是:如何将我的ArrayList呈现给ComboBox构造函数,使其看起来像一个可观察的列表?它是一种语法吗?还是我必须提前将ArrayList转换为另一个数据结构?
非常感谢,
-饶
最佳答案
ObservableList
是List
的子接口(interface)(专业版)。 (ObservableList
添加了用于观察列表更改的功能。)ArrayList
是List
的特定实现,但不是ObservableList
的实现。因此,您可以在需要ArrayList
的任何地方传递List
,但是如果期望ArrayList
,则不能传递ObservableList
。
顺便说一句,请注意,实际上不建议公开实现类型,但实际上应该公开接口(interface)类型:
import java.util.List;
import java.util.ArrayList;
public class PizzaMgr{
private List<Topping> orderedToppings;
public PizzaMgr(){
orderedToppings = new ArrayList<Topping>();
orderedToppings.add(new Topping("Pepperoni"));
orderedToppings.add(new Topping("Mushrooms"));
orderedToppings.add(new Topping("Onions"));
}
public List<Topping> getList(){
return orderedToppings;
}
}
要从常规
ObservableList
创建List
,可以使用ComboBox<Topping> topMenu
= new ComboBox<Topping>(FXCollections.observableList(m.getList()));
这将创建一个新的
ObservableList
,以“包装”您提供的数组列表。 IE。在可观察列表上调用get(index)
或add(item)
只是将委派给您提供的列表。你也可以
ComboBox<Topping> topMenu
= new ComboBox<Topping>(FXCollections.observableArrayList(m.getList()));
这将创建一个新的可观察列表,并将您提供的列表中的所有元素复制到该列表中。因此,随后操作一个列表将不会更改另一个列表。