我是半初学的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项提取到Observable List中?我一直在阅读Arraylists,Observable Lists,一般界面,但我无法弄清楚如何让它发挥作用。我已经读过ArrayList是一个Collection,而Observable List可以是Collection的接口,所以我觉得我在家里是免费的。但是,当我尝试实现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构造函数,使其看起来像一个Observable List?这是一种轻微的语法吗?或者我是否必须事先将ArrayList转换为另一个数据结构?
非常感谢, -RAO
答案 0 :(得分:4)
for _ in range(1000):
np.random.shuffle(ar)
print(ar)
是ObservableList
的子接口(专用版)。 (List
添加了观察列表更改的功能。)ObservableList
是ArrayList
的特定实现,但不是List
的实现。因此,您可以在预期ObservableList
的任何地方传递ArrayList
,但如果预计有List
,则无法传递ArrayList
。
另外,请注意,并不是真的建议公开实现类型,但是你应该只公开接口类型:
ObservableList
要从常规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
或get(index)
只需委托给您提供的列表。
您也可以
add(item)
将创建一个新的可观察列表,并将您提供的列表中的所有元素复制到其中。因此,随后操纵一个列表不会改变另一个列表。
答案 1 :(得分:1)
要创建observableList
,您需要首先拥有预定义列表,例如arrayList
。将列表传递给observableList
的实例,如下所示......
//Assuming you had this for a list
List<String> list = new ArrayList<String>();
//Pass it over in this manner
ObservableList<String> observableList = FXCollections.observableList(list);
//Then add a listener
observableList.addListener (new ListChangeListener() {
//override the method here
}
希望它会有所帮助...
答案 2 :(得分:1)
ArrayList<Site> sites = new ArrayList < Site > ();
sites.add(new Site("Google", "http://www.google.com"));
ObservableList<Site> siteList = FXCollections.observableArrayList(sites);
final ComboBox comboBox = new ComboBox(siteList);
Button btn = new Button();
btn.setText("Read comboBox");
btn.setOnAction(new EventHandler < ActionEvent > () {
@Override
public void handle(ActionEvent event) {
label.setText("selected: " + comboBox.getValue());
Site site = (Site) comboBox.getSelectionModel().getSelectedItem();
System.out.println(site.name);
}
});