2013-10-08 10 views
8

ich einen ComboBox<Perosn> vom Typ haben Person, in dem ich einige Objekt von Person Klasse hinzugefügt haben,JavaFx bearbeitbare ComboBox: Zeige toString auf Artikelauswahl

Ich habe setCellFactory(Callback) Methode zu zeigen, Personennamen in ComboBox Dropdown

verwendet
combobox.setCellFactory(
    new Callback<ListView<Person >, ListCell<Person >>() { 
     @Override 
     public ListCell<Person > call(ListView<Person > p) { 
      ListCell cell = new ListCell<Person >() { 
       @Override 
       protected void updateItem(Person item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setText(""); 
        } else { 
         setText(item.getName()); 
        } 
       } 
      }; 
      return cell; 
     } 
    }); 

Und, setButtonCell(ListCell) Methode, Namen in combobox auf Auswahl zu zeigen.

combobox.setButtonCell(
    new ListCell<Object>() { 
     @Override 
     protected void updateItem(Person t, boolean bln) { 
      super.updateItem(t, bln); 
      if (bln) { 
       setText(""); 
      } else { 
       setText(t.getName()); 
      } 
     } 
    }); 

Dies funktioniert perfekt gut mit Normalfall, aber wenn ich editierbare Combobox verwenden, dann scheitert dies.

Wenn ich schreibe, combobox.setEditable(true); dann auf Artikelauswahl das Textfeld (Editor) der Combobox zeigt toString() Methode der Personenklasse.

Normalfall: Normal Case

Editierbare Fall: Editable Case

Gibt es eine Lösung für dieses ??

ich eine Modellklasse haben,

public class Person { 
    String name; 
    int age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    @Override 
    public String toString() { 
     return "Person{" + "name=" + name + ", age=" + age + '}'; 
    } 
} 

Antwort

11

Hier ist eine Antwort auf meine eigene Frage, die ich nach vielen Bemühungen und Korrekturen am besten fand.

mainComboBox.setButtonCell(
    new ListCell<Object>() { 
     @Override 
     protected void updateItem(Object t, boolean bln) { 
      super.updateItem(t, bln); 
      if (bln) { 
       setText(""); 
      } else { 
       setText(getStringField(t)); 
      } 
     } 
    }); 

mainComboBox.setConverter(
    new StringConverter() { 
     private Map<String, Object> map = new HashMap<>(); 

     @Override 
     public String toString(Object t) { 
      if (t != null) { 
       String str = getStringField(t); 
       map.put(str, t); 
       return str; 
      } else { 
       return ""; 
      } 
     } 

     @Override 
     public Object fromString(String string) { 
      if (validate && !map.containsKey(string)) { 
       mainComboBox.setValue(null); 
       mainComboBox.getEditor().clear(); 
       return null; 
      } 
      return map.get(string); 
     } 
    }); 

mainComboBox.setCellFactory(
    new Callback<ListView<Object>, ListCell<Object>>() { 
     @Override 
     public ListCell<Object> call(ListView<Object> p) { 
      ListCell cell = new ListCell<Object>() { 
       @Override 
       protected void updateItem(Object item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setText(""); 
        } else { 
         setText(getStringField(item)); 
        } 
       } 
      };return cell; 
     } 
    }); 

Und mit der erforderlichen Funktion von getStringField(Object),

public String getStringField(Object o) { 
    return ((Pesron) o).getName(); 
} 
+1

Haben Sie meine Antwort gesucht, die die richtige Lösung gibt und wurde 1 Stunde gebucht, nachdem Ihre Frage gestellt wurde? – Sebastian

15

Sie müssen zu diesem Zweck eine StringConverter auf der ComboBox setzen (es gibt keine andere Möglichkeit, den Quellcode von ComboBox suchen)

Hier ein Beispiel:

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ComboBox; 
import javafx.stage.Stage; 
import javafx.util.StringConverter; 

import java.util.Arrays; 
import java.util.List; 

public class ComboBoxTest extends Application { 
    private ComboBox<Integer> cmb_year = new ComboBox<>(); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Group root = new Group(); 
     root.getChildren().add(cmb_year); 
     cmb_year.setPrefWidth(150); 
     Scene scene = new Scene(root, 500, 500); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     List<Integer> ints = Arrays.asList(2012, 2013, 2014, 2015); 
     cmb_year.getItems().addAll(ints); 

     cmb_year.setConverter(
      new StringConverter<Integer>() { 
       @Override 
       public String toString(Integer integer) { 
        if (integer == null) { 
         return ""; 
        } else { 
         return "that's a year: " + integer.intValue(); 
        } 
       } 

       @Override 
       public Integer fromString(String s) { 
        try { 
         return Integer.parseInt(s); 
        } catch (NumberFormatException e) { 
         return null; 
        } 
       } 
      }); 

     cmb_year.setPromptText("select year"); 
     cmb_year.setEditable(true); 

     Button distraction = new Button("distraction"); 
     distraction.setLayoutX(100); 
     distraction.setLayoutY(100); 
     root.getChildren().add(distraction); 
    } 
} 

Ergebnis:

enter image description here

Verwandte Themen