我是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转换为另一个数据结构?

非常感谢,
-饶

最佳答案

ObservableListList的子接口(interface)(专业版)。 (ObservableList添加了用于观察列表更改的功能。)ArrayListList的特定实现,但不是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()));

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

10-07 19:31
查看更多