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);