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

Convert ArrayList to Observable List for JavaFX program?

我是一个半初学者 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 列表中?我一直在阅读 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转换成其他数据结构?

非常感谢, -饶

ObservableListList 的子界面(专业版)。 (ObservableList 添加了观察列表更改的功能。)ArrayListList 的特定实现,但不是 ObservableList 的实现。因此,您可以在任何需要 List 的地方传递 ArrayList,但如果需要 ObservableList,则不能传递 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;
  }
}

要从常规 List 创建 ObservableList,您可以使用

ComboBox<Topping> topMenu 
    = new ComboBox<Topping>(FXCollections.observableList(m.getList()));

这会创建一个新的 ObservableList,"wraps" 您提供的数组列表。 IE。在可观察列表上调用 get(index)add(item) 只是委托给您提供的列表。

你也可以

ComboBox<Topping> topMenu 
    = new ComboBox<Topping>(FXCollections.observableArrayList(m.getList()));

这将创建一个新的可观察列表并将您提供的列表中的所有元素复制到其中。因此,随后操纵一个列表不会改变另一个列表。

要创建 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
}

希望对你有所帮助...

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);
    }
});