2017-09-27 2 views
0

Mon application doit autoriser les ajouts à la liste. J'ai compris comment je peux ajouter dynamiquement à une liste en utilisant observableArrayList. Si je clique sur le bouton, un élément est ajouté à la liste et affiché.Comment installer un gestionnaire de clics sur une liste dynamique (dans tornadofx)

Maintenant, j'ai du mal à ajouter un gestionnaire de clic (je veux gérer l'événement qui se produit lorsque quelqu'un clique sur un élément de la liste). Où est-ce que je fais ça?

Voici mon code.

package someapp 

import javafx.collections.FXCollections 
import javafx.geometry.Pos 
import javafx.scene.layout.VBox 
import javafx.scene.text.FontWeight 
import tornadofx.* 

class MyApp : App(HelloWorld::class) { 
} 

class HelloWorld : View() { 
    val leftSide: LeftSide by inject() 

    override val root = borderpane { 
     left = leftSide.root 
    } 
} 

class LeftSide: View() { 

    var requestView: RequestView by singleAssign() 

    override val root = VBox() 

    init { 
     with(root) { 
      requestView = RequestView() 
      this += requestView 

      this += button("Add Item") { 
       action { 
        requestView.responses.add(Request("example.com", 
          "/foo/bar", 
          "{ \"foo\" : \"bar\"}".toByteArray())) 
       } 
      } 

     } 
    } 

} 


class RequestView : View() { 

    val responses = FXCollections.observableArrayList<Request>(
    ) 

    override val root = listview(responses) { 
     cellFormat { 
      graphic = cache { 
       form { 
        fieldset { 
         label(it.hostname) { 
          alignment = Pos.CENTER_RIGHT 
          style { 
           fontSize = 22.px 
           fontWeight = FontWeight.BOLD 
          } 
         } 
         field("Path") { 
          label(it.path) 
         } 

        } 
       } 
      } 
     } 

    } 

} 

class Request(val hostname: String, val path: String, val body: ByteArray) { 
} 

Répondre

2

Pour configurer un rappel lorsqu'un élément dans un ListView est sélectionné, utilisez la fonction de rappel onUserSelect:

onUserSelect { 
    information("You selected $it") 
} 

Vous pouvez éventuellement passer le nombre de clics constitue une sélection et, par défaut est 2:

onUserSelect(1) { 
    information("You selected $it") 
} 

Vous utilisez des constructions obsolètes dans votre code, voici une version mise à jour converti aux meilleures pratiques :)

class MyApp : App(HelloWorld::class) 

class HelloWorld : View() { 
    override val root = borderpane { 
     left(LeftSide::class) 
    } 
} 

class LeftSide : View() { 
    val requestView: RequestView by inject() 

    override val root = vbox { 
     add(requestView) 
     button("Add Item").action { 
      requestView.responses.add(Request("example.com", 
        "/foo/bar", 
        """{ "foo" : "bar"}""".toByteArray())) 
     } 
    } 
} 


class RequestView : View() { 
    val responses = FXCollections.observableArrayList<Request>() 

    override val root = listview(responses) { 
     cellFormat { 
      graphic = cache { 
       form { 
        fieldset { 
         label(it.hostname) { 
          alignment = Pos.CENTER_RIGHT 
          style { 
           fontSize = 22.px 
           fontWeight = FontWeight.BOLD 
          } 
         } 
         field("Path") { 
          label(it.path) 
         } 
        } 
       } 
      } 
     } 
     onUserSelect(1) { 
      information("You selected $it") 
     } 
    } 

} 

class Request(val hostname: String, val path: String, val body: ByteArray) 
+0

C'est génial, merci. Je suis très reconnaissant de connaître les meilleures pratiques. Avec la nouvelle syntaxe, cependant, je ne suis pas tout à fait sûr de la façon dont j'obtiens des références aux vues. Par exemple, si je voulais ajouter une vue à HelloWorld (dans la bonne position), comment câbler 'onUserSelect (1)' pour que je puisse parler à l'instance de la vue de droite? Je suis un peu confus par l'utilisation de ':: class' parce que je suppose que je voudrais une référence à l'instance, pas la classe (ce qui se passe évidemment sous le capot, mais je ne sais pas comment je fais référence à l'objet instancié, et d'où (init?)). – xrd

+0

Ou, où est la nouvelle syntaxe documentée? – xrd

+0

Cette syntaxe est utilisée dans tout le guide. Si vous trouvez des exemples utilisant une syntaxe obsolète, veuillez soumettre un problème avec le projet guide et nous le mettrons à jour :) –