valuemember valores valor tomar sacar obtener extraer como capturar asignar combobox javafx-2 javafx-8 selectionmodel

valores - sacar el valor de un combobox vb



CuestiĆ³n de valor de compensaciĆ³n de cuadro combinado (8)

Me he topado con un problema con Comboboxes en javafx2.2. Este es el escenario:

  • Los usuarios hacen clic en el botón ''editFile''.
  • Otro panel se vuelve visible (con el método setVisible).

Este panel contiene 6 comboboxes. Tres de ellos tienen elementos fijos: cboReport, cboSales, cboSend. Tres de ellos obtienen sus datos de una base de datos (ObservableList) y se llenan cuando el panel se hace visible: cboFile, cboCustomer, cboVet

  • El usuario selecciona un número de archivo del archivo cbo. El resto de los comboboxes se ajustan con los valores correctos.
  • El usuario presiona el botón Guardar, el archivo se guarda como está previsto.
  • A continuación el usuario presiona un botón de cierre.

Cuando la ventana se cierra, los datos en el panel se restablecen a través de un método resetGUI_editFilePane (). Hay líneas como:

... cboReport.getSelectionModel().clearSelection(); cboSales.getSelectionModel().clearSelection(); cboSend.getSelectionModel().clearSelection(); cboFile.getSelectionModel().clearSelection(); cboCustomer.getSelectionModel().clearSelection(); cboVet.getSelectionModel().clearSelection(); cboFile.getItems().clear(); cboCustomer.getItems().clear(); cboVet.getItems.clear(); ...

Cuando el usuario abre el panel de nuevo presionando el botón "editar archivo", observo que solo los cuadros combinados "elemento fijo" han borrado su selección, los cuadros combinados dinámicamente muestran el último elemento seleccionado, aunque el valor de la selección en sí es null . ¿Esto me parece un error de gráficos o estoy haciendo algo mal?

¿Hay alguna forma de evitar este problema o cuál es el mejor método para restablecer un cuadro combinado?

EDITAR 2014/08/27:
Esto no es oficialmente un error (clearSelection () no borra el valor):
https://bugs.openjdk.java.net/browse/JDK-8097244

La "solución alternativa" oficial es borrar el valor del ComboBox después de borrar la selección.

cb.getSelectionModel().clearSelection(); // Clear value of ComboBox because clearSelection() does not do it cb.setValue(null);


Acabo de probar una solución de trabajo con Java JDK 1.7.11:

combobox.setSelectedItem(null); combobox.setValue(null);

Espero eso ayude :)


Es muy simple. Solo necesitas trabajar con la propiedad de valor de ComboBox. aqui tienes ....

ComboBox c; c.valueProperty().set(null);

Espero que esto te funcione :-D


Me encontré con casi la misma situación y encontré su pregunta mientras buscaba una solución. Afortunadamente, se me ocurrió una solución que obliga a los ComboBoxes a reiniciarse. Cuando reinicia los datos en su panel, en lugar de hacer algo como:

cboVet.getSelectionModel().clearSelection(); cboVet.getItems.clear();

hacer algo como esto ...

parentNode.getChildren().remove(cboVet); cboVet = new ComboBox(); // do whatever else you need to format your ComboBox parentNode.add(cboVet);

También deberá volver a hacer un setItems () en su ComboBox para que se rellene el nuevo. Esta no es una solución ideal, pero parece estar funcionando como espero que lo haría el método clearSelection () proporcionado.


Necesito borrar la selección del cuadro combinado. Y este código funcionó para mí:

List<Object> list = new ArrayList<>(comboBox.getItems()); comboBox.getItems().removeAll(list); comboBox.getItems().addAll(list);


Para borrar SelectionModel no encontré nada mejor que crear una nueva instancia de Combobox (actualización de respuestas anteriores):

myParentNode.getChildren().remove(myCombobox); myCombobox = new ComboBox(); myParentNode.add(myCombobox);

Pero esta solución desarrolla otros problemas: si usa fxml, este cuadro combinado se colocará en el lugar equivocado y con los parámetros incorrectos. Algunos parámetros fxml apenas se reproducen directamente desde el código de clase de su controlador y es horrible hacerlo cada vez que necesite borrar el cuadro combinado.

La solución está utilizando componentes personalizados en lugar de crear instancias directamente en el código de clase del controlador principal, incluso si estos componentes son estándar. Esto también ayuda a liberar algunas líneas en su clase de controlador principal moviendo los métodos de eventos relacionados con componentes y otros métodos a un archivo de clase separado, donde usa una referencia a su clase de controlador principal.

La forma de crear componentes personalizados en la aplicación JavaFX FXML se puede encontrar en http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm , pero tenga en cuenta que la clase CustomControlExample no es necesaria para cada componente personalizado en su aplicación, ya tiene una clase de punto de entrada con el método de inicio (etapa Satge).

¿Cómo resolver posibles errores con referencia de la clase de controlador de componente personalizado a la clase de controlador principal en JavaFx: cómo hacer referencia a la instancia de clase de controlador principal desde la clase CustomComponentController?


Puede recuperar los elementos y hacer que se eliminen todos:

cboVet.getItems().removeAll(cboVet.getItems());


Tuve el mismo problema con un ComboBox. El buttonCell de ComboBox no se actualiza correctamente cuando cambio los elementos de ComboBox. Esto parece un error de gráficos.

Uso la manipulación directa del campo buttonCell en ComboBox.

combo.getButtonCell().setText(""); combo.getButtonCell().setItem(null);

Esta es la mejor solución que he encontrado sin volver a crear ComboBox.


Uso la reflexión con la manipulación directa del campo buttonCell en la máscara de ComboBox:

@SuppressWarnings({ "rawtypes", "unchecked" }) public static <T> void resetComboBox(ComboBox<T> combo) { Skin<?> skin = combo.getSkin(); if(skin==null){ return; } combo.setValue(null); Field buttonCellField; try { buttonCellField = skin.getClass().getDeclaredField("buttonCell"); buttonCellField.setAccessible(true); ListCell buttonCell = (ListCell) buttonCellField.get(skin); if(buttonCell!=null){ StringProperty text = buttonCell.textProperty(); text.set(""); buttonCell.setItem(null); } } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } }

Creo que también es posible al proporcionar su propia implementación de buttonCell a través de la propiedad buttonCellFactory