Émission de la valeur de compensation de Combobox

je suis tombé sur un problème avec les Comboboxes dans javafx2.2. C'est le scénario:

  • utilisateurs cliquez sur le bouton' editFile'.
  • une autre vitre devient visible (avec la méthode setVisible).

ce volet contient 6 comboboxes. Trois d'entre eux ont des postes fixes: cboReport, cboSales, cboSend. Trois d'entre eux obtiennent leurs données à partir d'un db (ObservableList) et se peuplent lorsque le panneau devient visible: cboFile, cboCustomer, cboVet

  • l'utilisateur sélectionne un numéro de fichier dans le fichier cboFile. Le reste des comboboxes est réglé avec les valeurs correctes.
  • L'utilisateur appuie sur le bouton enregistrer, le fichier est enregistré comme prévu.
  • suivant l'utilisateur appuie sur un bouton Fermer.

lorsque la fenêtre se ferme, les données sur le volet sont resetgui_editfilepane (). Il y a des lignes de la forme:

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

quand l'utilisateur ouvre à nouveau la vitre en appuyant sur le bouton' editFile', je remarque que seuls les comboboxs 'fixed item' ont validé leur sélection, les comboboxs remplis dynamiquement montrent le dernier article sélectionné bien que la valeur de la sélection elle-même soit null. Cela ressemble à un bug graphique pour moi ou est-ce que je fais quelque chose de mal?

Est-il un moyen de contourner ce problème ou quelle est la meilleure méthode pour réinitialiser un combobox?

MODIFIER 2014/08/27:

Ce n'est officiellement pas un bug(clearSelection() n'a pas de valeur claire):

https://bugs.openjdk.java.net/browse/JDK-8097244

LA "solution de contournement" officielle est d'effacer la valeur du ComboBox après avoir effacé la sélection.

cb.getSelectionModel().clearSelection();
// Clear value of ComboBox because clearSelection() does not do it
cb.setValue(null);
19
demandé sur user11153 2012-08-27 17:01:54

8 réponses

j'ai rencontré à peu près la même situation et je suis tombé sur votre question en cherchant une solution. Heureusement, j'ai trouvé une solution qui force les ComboBoxes à se réinitialiser. Lorsque vous réinitialisez les données sur votre panneau, au lieu de faire quelque chose comme:

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

faire quelque chose comme cela...

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

vous aurez aussi besoin de refaire un setItems() sur votre ComboBox pour que le nouveau soit peuplé. Ce n'est pas une solution idéale, mais il semble fonctionner comme je l' attendez-vous à ce que la méthode clearSelection() fournie le soit.

16
répondu Brendan 2012-11-09 19:26:28

C'est très simple. Vous avez juste besoin de travailler avec la propriété value de ComboBox. ici vous allez ....

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

j'espère que cela fonctionne pour vous :-D

15
répondu Himanshu ARORA 2013-12-06 10:08:17

Vous pouvez récupérer les articles et les faire enlever:

cboVet.getItems().removeAll(cboVet.getItems());
9
répondu Pygmalion 2013-01-06 14:43:42

je viens de tester une solution de travail avec le Java JDK 1.7.11:

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

Espérons que cela aide :)

3
répondu Héctor Espí Hernández 2015-07-29 20:23:02

j'ai utiliser la réflexion par la manipulation directe de buttonCell champ dans la zone de liste déroulante de la peau:

@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();
    }

}

je pense que c'est aussi possible en fournissant votre propre buttonCell mise en œuvre par le biais de buttonCellFactory propriété

2
répondu Dagon 2012-11-19 15:39:56

j'ai eu le même problème avec un ComboBox. Le bouton du ComboBox n'est pas mis à jour correctement lorsque je change les éléments du ComboBox. Cela ressemble à un bug graphique.

j'utilise la manipulation directe du champ de la fesse en ComboBox.

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

C'est la meilleure solution que j'ai trouvé sans recréer le ComboBox.

1
répondu Tybo 2013-03-01 16:17:46

pour effacer SelectionModel Je n'ai rien trouvé de mieux que de créer une nouvelle instance de Combobox (mise à jour des réponses précédentes):

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

mais cette solution développe d'autres problèmes: si vous utilisez fxml, ce combobox sera placé au mauvais endroit et avec de mauvais paramètres. Certains paramètres fxml sont à peine reproduits directement à partir de votre code de classe de contrôleur et c'est terrible de le faire chaque fois que vous avez besoin d'effacer le combobox.

la solution utilise des composants personnalisés au lieu de créer des instances directement dans le code de classe du contrôleur principal, même si ces composants sont standards. Cela permet également de libérer certaines lignes dans votre classe de controller principale en déplaçant les méthodes d'événements liées à des composants et d'autres méthodes vers un fichier de classe séparé, où vous utilisez une référence à votre classe de controller principale.

comment créer des composants personnalisés dans L'Application JavaFX FXML peut être trouvé dans http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm, mais notez que la classe CustomControlExample n'est pas nécessaire pour chaque composant personnalisé dans votre application, si elle a déjà une classe de point d'entrée avec la méthode start(Satge stage).

comment résoudre les erreurs possibles avec la référence de la classe de Controller composante personnalisée à la classe de controller principale peut être trouvé dans JavaFx: comment référencer l'instance de la classe Controller principale à partir de la classe CustomComponentController?

1
répondu Zon 2017-05-23 11:46:34

je dois effacer la sélection de la boîte bascule. Et ce code a fonctionné pour moi:

 List<Object> list = new ArrayList<>(comboBox.getItems());
 comboBox.getItems().removeAll(list);
 comboBox.getItems().addAll(list);
0
répondu Maksym Pecheniuk 2018-07-03 19:20:04