2016-04-14 11 views
1

私は初心者のJavaプログラマです。さまざまなソースからJava FXを学びます。私のプログラムでは、ComboBoxを作成し、ArrayListからの一連のオブジェクトのtoString()出力を使って選択肢を設定したいと思います。ここで、ピザトッピングはオブジェクトとして定義されます。 、これまでのところは良いJavaFXプログラムのArrayListをObservable Listに変換しますか?

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

:彼らは、PizzaMgrオブジェクトのArrayListのための基本的栄光のラッパーを作成し、保存されています。しかし、私がヒットしたヒッチは、ComboBoxにPizzaMgrのArrayListのすべてのアイテムをリストさせたいときです。理想的には、私はこのコンボボックスコンストラクタを使用したいと思います:

ComboBox<T>(ObservableList<T> items) 

問題がありますか?すべてのArrayList項目をObservable Listに抽出する方法は?私はArraylists、Observable Lists、一般的なインターフェースについて読んできましたが、これをどう動かすかを理解することはできません。私はArrayListがCollectionであり、Observable ListがCollectionへのインターフェースであることを読んだので、私は自宅だったと思った。私はコンボボックスのコンストラクタを実装しようとするただし、:

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の実装ではありません。したがってArrayListにはListのいずれかを指定できますが、ObservableListが必要な場合はArrayListを渡すことはできません。脇の何かとして

、それは本当に実装タイプを公開することをお勧めしていないが、あなたは本当にただのインターフェイスタイプ公開する必要があります注意:通常のListから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; 
    } 
} 

を、あなたが使用することができます

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

を行うことができます。したがって、後で1つのリストを操作しても、他のリストは変更されません。

+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 
} 

は、それが動作

関連する問題