是否将ArrayList转换为JavaFX程序的可观察列表?

是否将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

我是一个半初学者Java程序员,从各种来源学习JavaFX。在我的程序中,我想创建一个组合框,并使用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;
  }
}
公共类顶级{
私有字符串名称;
公共浇头(字符串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); } });
它很管用!!!太棒了!!!我现在在月球上,你不知道。非常感谢,这真是太棒了。:)