Рендеринг POJO с помощью Combo Box JavaFX 2 без переопределения метода toString ()

У меня есть список сотрудников, имена которых мне нужно отобразить в поле со списком, чтобы пользователь мог выбрать. Следующий код отображает имена в раскрывающемся списке, но когда я выбираю имя, комбоотображаемый текст содержит полный POJO 'личность, строка как[email protected]»

cboEmployees.setCellFactory(new Callback()
    {
        @Override
        public ListCell call(ListView p)
        {
            return new ListCell()
            {
                @Override
                protected void updateItem(Employee item, boolean empty) {
                    super.updateItem(item, empty);

                    if (item != null)
                    {
                        setText(item.getName());
                    }
                }
            };
        }
    });

Есть ли способ сделать так, чтобы отображаемый текст отображал выбранное имя, не переопределяя POJO?s метод toString ()?

Ответы на вопрос(1)

Решение Вопроса

setButtonCell на вашеComboBox, предоставляя соответствующийListCell Реализация рендера для отображения имени сотрудника.

Например:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import javafx.util.Callback;

public class BasicComboBoxSample extends Application {
    public static void main(String[] args) { launch(args); }

    @Override public void start(Stage stage) {
        final Employee john = new Employee("John");
        final Employee jill = new Employee("Jill");
        final Employee jack = new Employee("Jack");

        final ComboBox<employee> cboEmployees = new ComboBox();
        cboEmployees.setButtonCell(new EmployeeListCell());
        cboEmployees.setCellFactory(new Callback<listview<employee>, ListCell<employee>>() {
            @Override public ListCell<employee> call(ListView<employee> p) {
                return new EmployeeListCell();
            }
        });
        cboEmployees.getItems().addAll(john, jill, jack);
        cboEmployees.setValue(jill);

        final StackPane layout = new StackPane();
        layout.getChildren().add(cboEmployees);
        layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 15;");
        stage.setScene(new Scene(layout));
        stage.show();
    }    

    class Employee {
        public Employee(String name) { this.name = name; }
        private String name;
        public String getName() { return name; }
    }

    class EmployeeListCell extends ListCell<employee> {
        @Override protected void updateItem(Employee item, boolean empty) {
            super.updateItem(item, empty);
            if (!empty && item != null) {
                setText(item.getName());
            } else {
                setText(null);
            }
        }
    }
}
</employee></employee></employee></employee></listview<employee></employee>

Пример вывода:

 etercap15 нояб. 2012 г., 02:41
Работал без нареканий, спасибо.
 JJ.07 окт. 2014 г., 02:03
Это работает, только если ComboBox недоступен для редактирования - для редактируемых ComboBox текстовое поле (редактор) не подчиняется указанному средству визуализации ячейки кнопки - оно все еще использует .toString (). Кто-нибудь знает, как это сделать?
 nafg23 мая 2016 г., 05:06
@JJ использует StringConverter
 bully23 дек. 2014 г., 18:23
Драгоценный камень - вы сделали мой день, как много раз, большое спасибо! Работает как шарм :)

Ваш ответ на вопрос