2016-04-14 79 views
1

我是一名半初學Java程序員,從各種來源學習Java FX。在我的程序中,我想創建一個ComboBox,並使用ArrayList中的一系列對象的toString()輸出填充選項。在這裏,比薩澆頭被定義爲一個對象。他們創建並存儲在一個PizzaMgr對象,基本上是一個華而不實的包裝爲一個ArrayList:將ArrayList轉換爲JavaFX程序的可觀察列表?

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項目提取到可觀察列表中?我一直在閱讀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

回答

1

ObservableList是子接口List(專門版本)。 (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「包裝」您提供的數組列表。即在可觀察列表上調用get(index)add(item)只需將其委託給您提供的列表。

你也可以做

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

這將創建一個新的觀察的名單,並複製從您提供到它的列表中的元素。所以後來操縱一個列表不會改變其他列表。

+0

它的工作原理!好棒!!!我現在正在登月,你不知道。萬分感謝,這真的很棒。 :) – Pete

0

要創建一個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 
} 

希望這將有助於...