Comment gérer l'action cliquée sur l'élément ListView?
J'ai mon JavaFX 2.0 de l'application, où j'ai besoin de faire une certaine action, après que l'utilisateur a cliqué sur un élément en élément ListView. Pour construire utilisateur GUI je suis en utilisant le FXML, dans lequel j'ai quelque chose comme ceci:
<children>
<ListView fx:id="listView" GridPane.columnIndex="0"
GridPane.rowIndex="1" labelFor="$pane"
onPropertyChange="#handleListViewAction"/>
</children>
Et voici ce que j'ai dans un Contrôleur pour cet événement:
@FXML protected void handleListViewAction(ActionEvent event) {
System.out.println("OK");
}
Et ici est une erreur, j'obtiens, lors de la scène, ce qui est pour ce gui est construit:
javafx.fxml.LoadException: java.lang.String does not define a property model for "property".
at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(Unknown Source)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(Unknown Source)
at javafx.fxml.FXMLLoader.processEndElement(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at fxmlexample.FXMLExampleController.handleSubmitButtonAction(FXMLExampleController.java:49)
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(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.Node.fireEvent(Unknown Source)
at javafx.scene.control.Button.fire(Unknown Source)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
at com.sun.javafx.scene.control.skin.SkinBase$5.handle(Unknown Source)
at com.sun.javafx.scene.control.skin.SkinBase$5.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.scene.Scene$MouseHandler.access$1300(Unknown Source)
at javafx.scene.Scene.impl_processMouseEvent(Unknown Source)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.notifyMouse(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.sun.glass.ui.win.WinApplication$2$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:722) java.lang.NullPointerException
at javafx.scene.Scene.doCSSPass(Unknown Source)
at javafx.scene.Scene.access$2900(Unknown Source)
at javafx.scene.Scene$ScenePulseListener.pulse(Unknown Source)
at com.sun.javafx.tk.Toolkit.firePulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit$8.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.sun.glass.ui.win.WinApplication$2$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:722)
Et le dernier bloc de cette exception (à partir d'ici java.lang.NullPointerException) est bouclée.
source d'informationauteur Agafonova Victoria
Vous devez vous connecter pour publier un commentaire.
FXML attributs et les valeurs sont directement mappés à des FX de l'API. Donc, pour savoir comment écrire handler, vous pouvez d'abord créer des entités nécessaires par l'API.
Il semble que vous voulez ajouter une action sur l'élément ListView sur clic de souris, vous devez ajouter de la souris cliquez sur gestionnaire. Dans l'API, il semble façon suivante:
En regardant le code, vous pouvez découvrir ce dans le FXML vous devez surdéfini attribut
onMouseClicked
:Et dans le contrôleur, vous devez fournir gestionnaire avec
MouseEvent
paramètre:réponse de @Sergey Grinev peut y avoir un problème. si votre liste est remplie pas assez complet, en d'autres mots peuvent avoir un espace vide.
ensuite, vous cliked espace vide ne sera pas tigrou sélection en train de changer.
la solution: Utiliser des ListCell.
Si vous ne savez pas combien d'articles que vous avez. vous n'aurez plus jamais seul. vous devez utiliser le temps pour l'espace.
Demostrate:
dans la liste segment de code:
AppListCellFactory.java:
}
Une solution simple pour Sergey réponse, sans avoir à créer un tout nouveau listCell (dans votre cas, vous le faites, mais nous n'avons pas à dans un texte normal des cas).
tout ce que vous devez faire est de simplement créer une variable temporaire qui est égal au premier élément de la liste au premier, et qui est changé à chaque nouvel élément cliqué. Une fois que vous essayez de cliquer sur l'élément nouveau, la variable temp sait que c'est la même chose, et avec une instruction if vous pouvez obtenir autour de cela.
temp Élément global de ce que vous mettez dessus
String tempItem = "admin";
pour moi, je savais que mon premier champ est toujours marqué "admin" alors je l'ai mis en tant que tel. vous auriez à obtenir la première entrée et de lui en dehors de la méthode que vous allez utiliser pour la liste de sélection.
Que pour moi j'ai utilisé un FXML document appelé ma méthode
}
Dans ce cas, vous pouvez simplement prendre la totalité du contenu de la selUser() la méthode et le mettre dans le userSel clic de souris.
Vous pouvez également consommer des événements indésirables sur l'espace vide.
dans
call()
de la cellule de l'usine d'ajouter:Cela va désactiver
click
&dragStart
trop.Ensemble cellFactory exemple de mon projet: