rowsource propiedad ejemplos dependientes cuadro combobox1 combinado additem combobox javafx-2

propiedad - ejemplos combobox vba excel



El cuadro combinado Javafx con objeto personalizado muestra la dirección del objeto aunque se utiliza la fábrica de celdas personalizada (2)

¡ fromString() proporcionar un método fromString() dentro del convertidor!

Tuve el mismo problema que usted y cuando implementé el fromString() con código de trabajo, ComboBox se comporta como se esperaba.

Esta clase proporciona algunos de mis objetos, para propósitos de prueba de desarrollo:

public class DevCatProvider { public static final CategoryObject c1; public static final CategoryObject c2; public static final CategoryObject c3; static { // Init objects } public static CategoryObject getCatForName(final String name) { switch (name) { case "Kategorie 1": return c1; case "Cat 2": return c2; case "Steuer": return c3; default: return c1; } } }

El objeto convertidor:

public class CategoryChooserConverter<T> extends StringConverter<CategoryObject> { @Override public CategoryObject fromString(final String catName) { //This is the important code! return Dev_CatProvider.getCatForName(catName); } @Override public String toString(final CategoryObject categoryObject) { if (categoryObject == null) { return null; } return categoryObject.getName(); } }

Tengo un cuadro combinado que muestra la lista de objetos de User . He codificado una fábrica de celdas personalizadas para el combobox:

@FXML ComboBox<User> cmbUserIds; cmbUserIds.setCellFactory(new Callback<ListView<User>,ListCell<User>>(){ @Override public ListCell<User> call(ListView<User> l){ return new ListCell<User>(){ @Override protected void updateItem(Useritem, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setGraphic(null); } else { setText(item.getId()+" "+item.getName()); } } } ; } });

ListView muestra una cadena (id + nombre), pero cuando selecciono un elemento de listview, Combobox muestra el valor de retorno del método toString (), es decir, la dirección del objeto. No puedo anular el método toString () porque el objeto de dominio de usuario debe ser el mismo que el del servidor. ¿Cómo mostrar id en combobox? Por favor recomiende

EDITAR1

Intenté debajo del código. Ahora el cuadro combinado muestra id cuando selecciono un valor de la vista de lista.

cmbUserIds.setConverter(new StringConverter<User>() { @Override public String toString(User user) { if (user== null){ return null; } else { return user.getId(); } } @Override public User fromString(String id) { return null; } });

El valor seleccionado en el cuadro combinado se borra cuando se pierde el enfoque de control. ¿Cómo arreglar esto?

EDIT2:

@FXML AnchorPane root; @FXML ComboBox<UserDTO> cmbUsers; List<UserDTO> users; public class GateInController implements Initializable { @Override public void initialize(URL location, ResourceBundle resources) { users = UserService.getListOfUsers(); cmbUsers.setItems(FXCollections.observableList(users)); cmbUsers.getSelectionModel().selectFirst(); // list of values showed in combo box drop down cmbUsers.setCellFactory(new Callback<ListView<UserDTO>,ListCell<UserDTO>>(){ @Override public ListCell<UserDTO> call(ListView<UserDTO> l){ return new ListCell<UserDTO>(){ @Override protected void updateItem(UserDTO item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setGraphic(null); } else { setText(item.getUserId()+" "+item.getUserNm()); } } } ; } }); //selected value showed in combo box cmbUsers.setConverter(new StringConverter<UserDTO>() { @Override public String toString(UserDTO user) { if (user == null){ return null; } else { return user.getUserId(); } } @Override public UserDTO fromString(String userId) { return null; } }); } }


Simplemente crea y establece un CallBack como sigue:

@FXML ComboBox<User> cmbUserIds; CallBack<ListView<User>, ListCell<User>> cellFactory = new Callback<ListView<User>, ListCell<User>>() { @Override public ListCell<User> call(ListView<User> l) { return new ListCell<User>() { @Override protected void updateItem(Useritem, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setGraphic(null); } else { setText(item.getId()+" "+item.getName()); } } } ; } } // Just set the button cell here: cmbUserIds.setButtonCell(cellFactory.call(null)); cmbUserIds.setCellFactory(cellFactory);