web-dev-qa-db-fra.com

combobox fxml, obtenir la valeur sélectionnée dans javafx

comment puis-je attraper la valeur sélectionnée d'un combobox fxml et l'implémenter dans une classe javafx?

j'ai donné à la liste déroulante le fx: id "échantillon" et créé un bouton avec onAction = "# test" et essayé .getValue et .getPromptText.

@FXML private ComboBox<String> Sample;

@FXML protected void test( ActionEvent event ) { 
String output = (String) Sample.getValue();
System.out.println(output);

String output = (String) Sample.getPromptText();
System.out.println(output);
}

Si j'essaye de le lancer, j'obtiens une erreur:

Java.lang.RuntimeException: Java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.Java:1440)
    at com.Sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.Java:69)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:217)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:170)
    at com.Sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.Java:38)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:37)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.EventUtil.fireEventImpl(EventUtil.Java:53)
    at com.Sun.javafx.event.EventUtil.fireEvent(EventUtil.Java:28)
    at javafx.event.Event.fireEvent(Event.Java:171)
    at javafx.scene.Node.fireEvent(Node.Java:6863)
    at javafx.scene.control.Button.fire(Button.Java:179)
    at com.Sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.Java:193)
    at com.Sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.Java:336)
    at com.Sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.Java:329)
    at com.Sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.Java:64)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:217)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:170)
    at com.Sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.Java:38)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:37)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.EventUtil.fireEventImpl(EventUtil.Java:53)
    at com.Sun.javafx.event.EventUtil.fireEvent(EventUtil.Java:33)
    at javafx.event.Event.fireEvent(Event.Java:171)
    at javafx.scene.Scene$MouseHandler.process(Scene.Java:3324)
    at javafx.scene.Scene$MouseHandler.process(Scene.Java:3164)
    at javafx.scene.Scene$MouseHandler.access$1900(Scene.Java:3119)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.Java:1559)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.Java:2261)
    at com.Sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.Java:228)
    at com.Sun.glass.ui.View.handleMouseEvent(View.Java:528)
    at com.Sun.glass.ui.View.notifyMouse(View.Java:922)
    at com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.Sun.glass.ui.win.WinApplication.access$100(WinApplication.Java:29)
    at com.Sun.glass.ui.win.WinApplication$3$1.run(WinApplication.Java:73)
    at Java.lang.Thread.run(Thread.Java:722)
Caused by: Java.lang.reflect.InvocationTargetException
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:601)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.Java:1435)
    ... 45 more
Caused by: Java.lang.NullPointerException
    at TW_JAVAFX_Undecorator.ButtonController.pruefen(ButtonController.Java:60)
    ... 50 more

Merci d'avance

Zombi

10
user2361460

Je pense que le code que vous avez dans votre question devrait fonctionner aussi longtemps que la casse de l'identifiant de la liste déroulante dans le code correspond à celle de votre fxml fx:id.

J'ai modifié cette application de démonstration de sélection de zone de liste déroulante JavaFX pour ajouter un bouton avec une méthode onAction permettant de récupérer une valeur de la zone de liste déroulante à l'aide de la méthode comboBox getValue().

Vérifiez le cas, je remarque que vous dites que le fx:id est sample, mais que dans votre code vous utilisez Sample - et que les cas doivent correspondre, sinon le chargeur fxml n'injectera pas correctement le nœud dans votre contrôleur.

Difficile de dire si la variable NullPointerException de votre code est liée à votre problème d'extraction de valeur de zone de liste déroulante car vous ne dites pas quel est le code à TW_JAVAFX_Undecorator.ButtonController.pruefen(ButtonController.Java:60) ou fournissez un code exécutable complet pour répliquer le problème.

6
jewelsea

Essaye ça:

String output = Sample.getSelectionModel().getSelectedItem().toString();
System.out.println(output);
28
RayFoX

Pour obtenir la valeur sélectionnée dans ComboBox, vous pouvez utiliser la méthode Sample.getSelectionModel.

Exemple:

myComboBox.getSelectionModel().selectedItemProperty()
    .addListener(new ChangeListener<String>() {
        public void changed(ObservableValue<? extends String> observable,
                            String oldValue, String newValue) {
            System.out.println("Value is: "+newValue);
        }
});
2
Maulik Patel

J'essayais de trouver une réponse à cette erreur (qui vient de m'arriver dans les mêmes conditions) et j'ai trouvé ce post.
Si vous avez déclaré votre identifiant ComboBox correctement comme le dit Jewelsea (sinon, je pense qu'une autre erreur serait apparue).

Le fait est que tout a été bien déclaré (aucune erreur de syntaxe ou erreur de compilation).
L'erreur est en cours d'exécution, l'événement @FXML protected void test(ActionEvent event) est en cours d'exécution lorsque vous remplissez/ajoutez des données à votre zone de liste déroulante.
Mais la propriété value ne change pas puisqu'aucune entrée utilisateur n'a été détectée (je suppose que vous ajoutez des données à votre ComboBox ailleurs lorsque vous initialisez la scène).
Donc, getValue() renvoie null.

Dans ce cas, la ligne qui a cassé le code est:

System.out.println(output);

Parce que la sortie est null.

Essayez de mettre un point d'arrêt au début de la méthode test(ActionEvent event).

J'attends cette aide aussi des autres.

0
hmojica