2016-11-17 2 views
0

Как я могу заполнить ChoiceBox, например. a StringProperty из моего пользовательского класса?Заполнение ChoiceBox с пользовательским свойством в JavaFX

Я просто проектирую в SceneBuilder с ChoiceBox, и у меня есть класс Person с моими данными.

public class Person{ 
    private final StringProperty firstName; 

    public Person(){ 
     this(null); 
    } 

    public Person(String fname){ 
     this.firstName = new SimpleStringProperty(fname); 
    } 

    public String getFirstName(){ 
     return this.firstName.get(); 
    } 

    public void setFirstName(String fname){ 
     this.firstName.set(fname); 
    } 

    public StringProperty firstNameProperty(){ 
     return this.firstName; 
    } 
} 

В главном классе у меня есть:

private ObservableList<Person> personList = FXCollections.observableArrayList(); 
this.personList.add(new Person("Human1")); 

RootController controller = loader.getController(); 
     controller.setChoiceBox(this); 

public ObservableList<Person> getPersonList(){ 
    return this.personList; 
} 

И в мой контроллер:

public class RootController { 
    @FXML 
    private ChoiceBox personBox; 

    public RootController(){ 

    } 

    @FXML 
    private void initialize(){ 

    } 

    public void setChoiceBox(App app){ 

     personBox.setItems(app.getPersonList()); 
    } 


} 

Но этот код заполнить мой ChoiceBox именем функции (??) или что-то в этом роде. Как я могу заполнить его свойством firstName?

ответ

0

Для вашей проблемы я бы предложил использовать «простой way'.The ChoiceBox использует toString() метод Person класса, в результате чего-то вроде [email protected].

Переопределяя метод toString(), вы можете определить, что отобразит ChoiceBox. В вашем случае возвращает значение firstName собственности:

@Override 
public String toString() { 
    return firstName.get(); 
} 
1

Обратите внимание, что вы создали себе большую проблему, сделав firstName свойство изменяемым здесь.

AFAIK невозможно сделать ChoiceBox прослушать модификации этого объекта (по крайней мере, не заменяя skin, что было бы ужасно сложно).

Это может быть сделано с ComboBox.

Вам просто нужно использовать пользовательские cellFactory:

private ListCell<Person> createCell(ListView<Person> listView) { 
    return new ListCell<Person>() { 

     @Override 
     protected void updateItem(Person item, boolean empty) { 
      super.updateItem(item, empty); 

      if (empty || item == null) { 
       textProperty().unbind(); 
       setText(""); 
      } else { 
       textProperty().bind(item.firstNameProperty()); 
      } 
     } 

    }; 
} 
ComboBox<Person> cb = new ComboBox<>(personList); 
cb.setCellFactory(this::createCell); 
cb.setButtonCell(createCell(null)); 
... 
+0

Я полностью с @fabian, но для меня возникает вопрос, почему и когда человек делает первый имя действительно изменить? EDIT: Upvote для подсказки – SSchuette

Смежные вопросы