# Erstellen eigener Combobox ("CellFactory")



## BlackC (30. Nov 2012)

Hallo Community,

ich hab ein Problem, das vermutlich simpel ist. Ich möchte meine eigene Combobox erstellen, abgeleitet von der normalen Combobox. Soweit so gut, mein Problem liegt darin, dass die Items ein Object ist (StructSKeySLabel, dass einen Schlüssel und Bezeichnung beinhaltet, als String) und dieses in der Liste so dargestellt werden soll. :  Key, Label 

Wie bekomme ich das hin ? Ich weiß, dass ich die CellFactory benutzen kann/soll, nur hängt es bei mir an diesem Schritt. Die Beispiele im Internet, haben mir mal nicht geholfen.

Hier mal mein Code bisher (der eigentlich "nichts" beinhaltet"):


```
public class CustomComboBox extends ComboBox{
    Boolean _errorMode;
    Integer _kindOfComboBox;

//    @Override
//    public ObjectProperty cellFactoryProperty() {
//        return new cellFactoryProperty{};
//      
//};
//    
//  }
```


----------



## dayaftereh (30. Nov 2012)

Hey, vielleicht verstehe ich dich jetzt falsch aber du willst in der Combobox eine eigene Anzieg für deine Object machen. Das heißt du hast ein Objekt das einmal getkey und einmal getvalue hat. Dann würde ich einfach meinen eigenen [JAPI]ListCellRenderer[/JAPI] erstellen. Schau dir mal das hier an How to Use Combo Boxes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Oder noch vieleinfacher , du überschriebst die toString Methode, da der Default-[JAPI]ListCellRenderer[/JAPI] diese Methode nutzt, um deine Objekt anzuzeigen.


----------



## BlackC (30. Nov 2012)

Ja genau, du hast mich richtig verstanden  Hab gerade deinen link überflogen und bin noch mehr verwirrt. JavaFX 2.1+ hat eine eigene Implementierung von Comboboxen, daher kann ich jetzt mit deinem Link (JFC/Swing) nicht viel anfangen, oder kann ich das 1:1 übernehmen ?

toString() zu überladen würde mir nichts bringen, da ich je nach Combobox-Art die Darstellung anders sein soll, trotz gleichem Unterbau (StructSKeySLabel).


----------



## Paddelpirat (30. Nov 2012)

In der JavaFX Doku ist ein Beispiel für die Benutzung der CellFactory:

ComboBox (JavaFX 2.2)

Vielleicht kannst du es ja einfach mal auf deine Bedürfnisse ummünzen.


----------



## BlackC (3. Dez 2012)

Also ich habe es mal implementiert und denke, es funktioniert auch, allerdings konnte ich bisher die Implementierung noch nicht testen. Hier mal meine Lösung für alle:


```
public class CustomComboBoxKeyLabel extends ComboBox{
    Boolean _errorMode;
    /* 0 = CustomChoiceBoxKeyLabel
     * 1 = CustomChoiceBoxKeyLabel2
     * 2 = CustomChoiceBoxKeyLabel3
     */
    final Integer _kindOfComboBox;

    public CustomComboBoxKeyLabel(Boolean _errorMode, final Integer _kindOfComboBox) {
        this._errorMode = _errorMode;
        this._kindOfComboBox = _kindOfComboBox;
        
        this.setCellFactory(new Callback<ListView<StructSKeySLabel>, ListCell<StructSKeySLabel>>() {
                @Override public ListCell<StructSKeySLabel> call(ListView<StructSKeySLabel> p) {
                return new ListCell<StructSKeySLabel>() { 
                    @Override
                    protected void updateItem(StructSKeySLabel t, boolean bln) {
                        super.updateItem(t, bln);

                        if (t == null || bln) {
                            // nichts
                        }  else {
                           if(_kindOfComboBox.equals(0)){
                               this.setText( t.getKey());
                           }else if(_kindOfComboBox.equals(1)){
                               this.setText( t.getLabel());
                           }else if(_kindOfComboBox.equals(2)){
                               this.setText( t.getKey()+", "+t.getLabel());
                           }
                       }                       
                    }
                };
            }
         }); 

    }
}
```


----------

