使用javafx2'渲染POJO;s组合框,而不重写toString()方法

使用javafx2'渲染POJO;s组合框,而不重写toString()方法,javafx,Javafx,我有一个员工列表,我需要将其姓名呈现在组合框中,供用户选择。下面的代码在下拉列表中呈现名称,但是当我选择一个名称时,组合显示的文本包含完整的POJO标识,一个类似“src.org.entities”的字符串。Employee@449ac7ce" cboEmployees.setCellFactory(新回调() { @凌驾 公共ListCell调用(ListView p) { 返回新的ListCell() { @凌驾 受保护的void updateItem(员工项,布尔值为空){ super.u

我有一个员工列表,我需要将其姓名呈现在组合框中,供用户选择。下面的代码在下拉列表中呈现名称,但是当我选择一个名称时,组合显示的文本包含完整的POJO标识,一个类似“src.org.entities”的字符串。Employee@449ac7ce"

cboEmployees.setCellFactory(新回调()
{
@凌驾
公共ListCell调用(ListView p)
{
返回新的ListCell()
{
@凌驾
受保护的void updateItem(员工项,布尔值为空){
super.updateItem(项,空);
如果(项!=null)
{
setText(item.getName());
}
}
};
}
});
有没有一种方法可以使显示的文本在不重写POJO的toString()方法的情况下也呈现选定的姓名?

组合框上调用,提供适当的
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);
            }
        }
    }
}
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.stage.stage;
导入javafx.util.Callback;
公共类BasicComboxSample扩展了应用程序{
公共静态void main(字符串[]args){launch(args);}
@覆盖公共无效开始(阶段){
最终员工约翰=新员工(“约翰”);
最终员工吉尔=新员工(“吉尔”);
最终员工杰克=新员工(“杰克”);
最终组合框cboEmployees=新组合框();
cboEmployees.setButtonCell(newEmployeeListCell());
cboEmployees.setCellFactory(新回调(){
@覆盖公共ListCell调用(ListView p){
返回新的EmployeeListCell();
}
});
cboEmployees.getItems().addAll(约翰、吉尔、杰克);
cboEmployees.setValue(吉尔);
最终StackPane布局=新StackPane();
layout.getChildren().add(cboEmployees);
布局。设置样式(“-fx背景色:玉米丝;-fx填充:15;”);
舞台场景(新场景(布局));
stage.show();
}    
班级员工{
公共雇员(字符串名){this.name=name;}
私有字符串名称;
公共字符串getName(){return name;}
}
类EmployeeListCell扩展了ListCell{
@覆盖受保护的void updateItem(员工项,布尔值为空){
super.updateItem(项,空);
如果(!empty&&item!=null){
setText(item.getName());
}否则{
setText(空);
}
}
}
}
样本输出:


这似乎仅在组合框不可编辑时有效-对于可编辑的组合框,文本字段(编辑器)不符合指定的按钮单元格呈现器-它仍然使用.toString()。有人知道怎么做吗?jewel-你让我开心了很多次,非常感谢!类似于charme:)@JJ使用StringConverter
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);
            }
        }
    }
}