是否将ArrayList转换为JavaFX程序的可观察列表?
我是一个半初学者Java程序员,从各种来源学习JavaFX。在我的程序中,我想创建一个组合框,并使用ArrayList中一系列对象的toString()输出填充选项。在这里,比萨浇头被定义为一个对象。它们被创建并存储在PizzaMgr对象中,基本上是ArrayList的美化包装器:是否将ArrayList转换为JavaFX程序的可观察列表?,arraylist,javafx,combobox,observablelist,Arraylist,Javafx,Combobox,Observablelist,我是一个半初学者Java程序员,从各种来源学习JavaFX。在我的程序中,我想创建一个组合框,并使用ArrayList中一系列对象的toString()输出填充选项。在这里,比萨浇头被定义为一个对象。它们被创建并存储在PizzaMgr对象中,基本上是ArrayList的美化包装器: public class Topping{ private String name; public Topping(String a){ this.name=a; } public Str
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;
}
}
公共类顶级{
私有字符串名称;
公共浇头(字符串a){
this.name=a;
}
公共字符串toString(){
返回此.name;
}
}
//=================================================
导入java.util.ArrayList;
公共课比萨经理{
私人ArrayList OrderedTopings;
公共比萨店经理(){
OrderedToppings=新的ArrayList();
添加(新的配料(“辣香肠”);
添加(新的配料(“蘑菇”);
订购配料。添加(新配料(“洋葱”);
}
公共ArrayList getList(){
退货订单;
}
}
到目前为止,一切顺利。但我遇到的问题是,我需要一个组合框来列出PizzaMgr的ArrayList中的所有项目。理想情况下,我希望使用这个组合框构造函数:
ComboBox<T>(ObservableList<T> items)
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());
}
}
组合框(可观察列表项)
问题出在哪里?如何将所有ArrayList项提取到可观察列表中?我一直在阅读ArrayList、Observable List和一般的接口,但我不知道如何让它工作。我已经读到ArrayList是一个集合,而Observable List可以是集合的接口,所以我认为我是自由的。但是,当我尝试实现ComboBox构造函数时:
ComboBox<T>(ObservableList<T> items)
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());
}
}
导入javafx.scene.control.*;
公共类菜单{
公共静态void main(字符串[]args){
Pizzamagr m=新的Pizzamagr();
ComboBox topMenu=新建ComboBox(m.getList());
}
}
我发现编译器错误:
Menu.java:18: error: incompatible types: ArrayList<Topping> cannot be converted to ObservableList<Topping>
ComboBox<Topping> topMenu = new ComboBox<Topping>(m.getList());
^
Menu.java:18:错误:不兼容的类型:ArrayList无法转换为ObservableList
ComboBox topMenu=新建ComboBox(m.getList());
^
很明显,我的ArrayList并不是一个可观察的列表
让我困惑的是:如何将我的ArrayList呈现给ComboBox构造函数,使它看起来像一个可观察的列表?这是一种轻微的手语吗?或者我必须事先将ArrayList转换为另一个数据结构吗
非常感谢,,
-RAO
可观察列表
是列表的子接口(专用版本)。(ObservableList
添加了观察列表更改的功能。)ArrayList
是list
的特定实现,但不是ObservableList
的实现。因此,您可以在任何需要列表的地方传递ArrayList
,但如果需要可观测列表,则无法传递ArrayList
顺便说一下,不建议公开实现类型,但应该公开接口类型:
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;
}
}
这将创建一个新的可观察列表
,用于“包装”您提供的数组列表。也就是说,在可观察列表上调用get(index)
或add(item)
,只会代表您提供的列表
你也可以这样做
ComboBox<Topping> topMenu
= new ComboBox<Topping>(FXCollections.observableArrayList(m.getList()));
组合框顶部菜单
=新组合框(FXCollections.observableArrayList(m.getList());
这将创建一个新的可观察列表,并将您提供的列表中的所有元素复制到其中。因此,随后操作一个列表不会改变另一个列表。要创建可观察列表
,首先需要有一个预定义的列表,例如数组列表
。将列表传递给下面的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
}
//假设您将此作为列表
列表=新的ArrayList();
//这样传过去
ObservableList ObservableList=FXCollections.ObservableList(列表);
//然后添加一个侦听器
observableList.addListener(新的ListChangeListener(){
//在此处重写该方法
}
希望它能帮助…arraylistsites=newarraylist();
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);
}
});
添加(新站点(“谷歌”http://www.google.com"));
ObservableList siteList=FXCollections.observableArrayList(站点);
最终组合框组合框=新组合框(站点列表);
按钮btn=新按钮();
btn.setText(“读取组合框”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
label.setText(“所选:”+comboBox.getValue());
Site Site=(Site)comboBox.getSelectionModel().getSelectedItem();
System.out.println(site.name);
}
});
它很管用!!!太棒了!!!我现在在月球上,你不知道。非常感谢,这真是太棒了。:)