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

Pet*_*ete 7 combobox javafx arraylist observablelist

我是一名半初学者 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。但我遇到的问题是当我想要一个 ComboBox 列出 PizzaMgr 的 ArrayList 中的所有项目时。理想情况下,我想使用这个 ComboBox 构造函数:

ComboBox<T>(ObservableList<T> items)
Run Code Online (Sandbox Code Playgroud)

问题?如何将所有 ArrayList 项提取到 Observable List 中?我一直在阅读 Arraylists、Observable Lists、接口,但我不知道如何让它工作。我读过 ArrayList 是一个集合,而 Observable 列表可以是一个集合的接口,所以我以为我是自由的。但是,当我尝试实现 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

Menu.java:18: error: incompatible types: ArrayList<Topping> cannot be converted to ObservableList<Topping>
            ComboBox<Topping> topMenu = new ComboBox<Topping>(m.getList());
                                                                       ^
Run Code Online (Sandbox Code Playgroud)

很明显,我的 ArrayList 不被视为可观察列表。

难倒我的是:如何将我的 ArrayList 呈现给 ComboBox 构造函数,使其看起来像一个 Observable List?它是一种简单的语法吗?还是我必须提前将 ArrayList 转换为另一种数据结构?

非常感谢,-RAO

Jam*_*s_D 9

ObservableList是一个子接口(专用版本)List。(ObservableList添加用于观察列表更改的功能。)ArrayList是 的特定实现List,但不是 的实现ObservableList。因此,您可以ArrayListList预期的任何地方传递a ,但ArrayList如果ObservableList预期是an,则不能传递 an 。

顺便说一句,请注意并不真正建议公开实现类型,但您应该只公开接口类型:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

ComboBox<Topping> topMenu 
    = new ComboBox<Topping>(FXCollections.observableList(m.getList()));
Run Code Online (Sandbox Code Playgroud)

它创建了一个新的ObservableList“包装”您提供的数组列表。即调用get(index)add(item)在可观察列表上只是委托给您提供的列表。

你也可以这样做

ComboBox<Topping> topMenu 
    = new ComboBox<Topping>(FXCollections.observableArrayList(m.getList()));
Run Code Online (Sandbox Code Playgroud)

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

  • 有用!!!好棒!!!我现在在月球上,你不知道。感谢一百万,这真的很棒。:) (3认同)

小智 5

要创建一个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
}
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助...