将ArrayList转换为JavaFX程序的Observable List?

时间:2016-04-14 17:03:00

标签: arraylist javafx combobox 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;
  }
}

到目前为止,这么好。但是当我想要一个ComboBox列出PizzaMgr的ArrayList中的所有项目时,我遇到的障碍就是。理想情况下,我想使用这个ComboBox构造函数:

ComboBox<T>(ObservableList<T> items)

问题?如何将所有ArrayList项提取到Observable List中?我一直在阅读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转换为另一个数据结构?

非常感谢, -RAO

3 个答案:

答案 0 :(得分:4)

for _ in range(1000): np.random.shuffle(ar) print(ar) ObservableList的子接口(专用版)。 (List添加了观察列表更改的功能。)ObservableListArrayList的特定实现,但不是List的实现。因此,您可以在预期ObservableList的任何地方传递ArrayList,但如果预计有List,则无法传递ArrayList

另外,请注意,并不是真的建议公开实现类型,但是你应该只公开接口类型:

ObservableList

要从常规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())); ,它“包装”您提供的数组列表。即在可观察列表上调用ObservableListget(index)只需委托给您提供的列表。

您也可以

add(item)

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

答案 1 :(得分:1)

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

希望它会有所帮助...

答案 2 :(得分:1)

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