from - seleccionar un item de un combobox javafx
Renderizar un POJO con el cuadro combinado de JavaFX 2 sin anular el método toString() (1)
Tengo una lista de empleados cuyos nombres necesito presentar en un cuadro combinado para que el usuario los seleccione. El siguiente código representa los nombres en la lista desplegable, pero cuando selecciono un nombre, el texto que aparece en el combo contiene la identidad completa de POJO, una cadena como "src.org.entities.Employee@449ac7ce"
cboEmployees.setCellFactory(new Callback<ListView<Employee>, ListCell<Employee>>()
{
@Override
public ListCell<Employee> call(ListView<Employee> p)
{
return new ListCell<Employee>()
{
@Override
protected void updateItem(Employee item, boolean empty) {
super.updateItem(item, empty);
if (item != null)
{
setText(item.getName());
}
}
};
}
});
¿Hay alguna manera de hacer que el texto mostrado represente también el nombre seleccionado sin alterar el método de POJO''s toString ()?
Invoque setButtonCell en su ComboBox
, proporcionando una implementación apropiada del renderizador ListCell
para mostrar el nombre del empleado.
Por ejemplo:
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);
}
}
}
}
Muestra de salida: