2016-04-14 17 views
1

Ich bin ein Anfänger Java-Programmierer, Java FX aus einer Vielzahl von Quellen zu lernen. In meinem Programm möchte ich eine ComboBox erstellen und die Auswahl mit der toString() - Ausgabe einer Reihe von Objekten aus einer ArrayList füllen. Hier werden Pizzabeläge als Objekt definiert. Sie werden erstellt und in einem PizzaMgr Objekt gespeichert, im Grunde eine verherrlicht Wrapper für eine Arraylist:ArrayList in Observable List für JavaFX-Programm konvertieren?

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

So weit, so gut. Aber die Schwierigkeit ist, wenn ich möchte, dass eine ComboBox alle diese Elemente in der ArrayList von PizzaMgr auflistet. Idealerweise würde ich gerne diesen ComboBox-Konstruktor verwenden:

Das Problem? Wie extrahiert man alle ArrayList-Objekte in eine Observable List? Ich habe auf Arraylists, Observable Lists, Interfaces im Allgemeinen gelesen, aber ich kann mir nicht vorstellen, wie ich das zum Laufen bringen kann. Ich habe gelesen, dass eine ArrayList eine Sammlung ist und die Observable List eine Schnittstelle zu einer Collection sein kann, also dachte ich, ich wäre zu Hause frei. Allerdings, wenn ich versuche, den ComboBox Konstruktor zu implementieren:

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

Ich erhalte den Compiler-Fehler:

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

So offensichtlich meine Arraylist wird nicht als beobachtbare Liste gesehen.

Was mich stempelt ist: Wie kann ich meine ArrayList dem ComboBox-Konstruktor präsentieren, so dass es wie eine Observable List aussieht? Ist es eine leichte Syntax? Oder muss ich die ArrayList vorher in eine andere Datenstruktur konvertieren?

Vielen Dank, -RAO

Antwort

1

ObservableList ist eine Sub-Schnittstelle (spezialisierte Version) List. (ObservableList fügt Funktionalität zum Beobachten von Änderungen an der Liste hinzu.) ArrayList ist eine bestimmte Implementierung von List, ist aber keine Implementierung von ObservableList. Daher können Sie einen ArrayList überall dort passieren, wo ein List erwartet wird, aber Sie können einen ArrayList nicht übergeben, wenn ein ObservableList erwartet wird.

als so etwas wie ein beiseite, beachten Sie es nicht wirklich empfohlen, die Umsetzung Art auszusetzen, aber Sie sollten wirklich nur den Schnittstellentyp aussetzen:

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

Um eine ObservableList von einem regelmäßigen List zu erstellen, können Sie verwenden

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

, die eine neue ObservableList, dass "Wraps", um die Array-Liste Sie bieten erstellt. I.e. Rufen Sie get(index) oder add(item) auf der beobachtbaren Liste einfach an die Liste, die Sie bereitstellen.

könnten Sie tun auch

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

, die eine neue beobachtbaren Liste erstellen würde und kopieren Sie alle Elemente aus der Liste, die Sie in diese Entscheidung. So würde die Manipulation einer Liste die andere nicht ändern.

+0

Es funktioniert !!! So genial!!! Ich bin jetzt überglücklich, du hast keine Ahnung. Tausend Dank, das ist wirklich großartig. :) – Pete

0

Um eine observableList zu erstellen, müssen Sie zuerst eine vordefinierte Liste haben, zB eine arrayList. Übergeben Sie die Liste auf eine Instanz observableList wie unten ...

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

Hoffe, es hilft ...