Charm AutoCompleteTextField setSelectedItem

AutoCompleteTextField принимает List<T> за его более полную функцию. Хотя его можно инициализировать строкой, кажется, невозможно инициализировать его объектом типа T, потому что AutoCompleteTextField.valueProperty доступен только для чтения, а SelectionModel нет.

public class GluonApplication extends MobileApplication {

@Override
public void init() {
    ObservableList<Person> persons = getPersons();
    Person defaultPerson = persons.get(0);
    FilteredList<Person> personsFiltered = new FilteredList<>(persons);

    AutoCompleteTextField<Person> txtPerson = new AutoCompleteTextField<>();
    txtPerson.setCompleter(s ->
    {
        personsFiltered.setPredicate(person -> person.name.contains(s));
        return personsFiltered;
    });

    TextField txtSelectedPerson = new TextField();
    txtPerson.valueProperty().addListener((obsValue, p, p1) -> txtSelectedPerson.setText(p1.name));

    Button btnSave = new Button("SAVE");
    btnSave.setOnAction(e ->
    {
        Person selectedPerson = txtPerson.getValue(); //if no autocomplete suggestion was selected, valueProperty is empty
        // save selectedPerson
    });

    VBox root = new VBox(txtPerson, txtSelectedPerson, btnSave);
    root.setAlignment(Pos.CENTER);

    addViewFactory(HOME_VIEW, () ->
    {

        View view = new View(root) {
            @Override
            protected void updateAppBar(AppBar appBar) {
                appBar.setTitleText("AutoCompleteTest");
            }
        };

        view.setOnShowing(e -> txtPerson.setText(defaultPerson.name));  // here I would like to set the person object instead
                                                                        // of its string representation
        return view;
    });
}

private ObservableList<Person> getPersons() {
    return FXCollections.observableArrayList(new Person("person1"), new Person("person2"), new Person("person3"));
}

private static class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

}

}


person jns    schedule 16.11.2016    source источник
comment
Речь идет не о получении значения, а о его установке. Я хотел бы инициализировать AutoCompleteField с объектом T при отображении представления. Я мог бы инициализировать его строкой, но тогда мне пришлось бы сопоставлять имя обратно с объектом, когда я хочу его получить.   -  person jns    schedule 16.11.2016
comment
Можете ли вы опубликовать фрагмент кода с этим?   -  person José Pereda    schedule 16.11.2016
comment
Добавлен фрагмент кода   -  person jns    schedule 16.11.2016
comment
Если я правильно понял, вы хотите переопределить AutoCompleteTextField::setText, который, в свою очередь, происходит от TextField::setText, который допускает только строку?   -  person José Pereda    schedule 16.11.2016
comment
В основном я хочу инициализировать AutoCompleteTextField объектом, поэтому я могу получить объект через valueProperty, даже если не было выбрано предложение автозаполнения (я отредактировал свой вопрос)   -  person jns    schedule 16.11.2016
comment
JavaDoc уже говорит о valueProperty, что if no value has been selected this property will be null, и вы не можете предварительно выбрать какой-либо из элементов, поэтому он работает, только если вы открываете всплывающее окно и выбираете один.   -  person José Pereda    schedule 16.11.2016
comment
Это должно быть исправлено в следующем релизе. В то же время, да, возможно найти обходной путь, основанный на поиске, чтобы получить всплывающий слой.   -  person José Pereda    schedule 16.11.2016