Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Problème ListView ContextMenu getItem


Sujet :

JavaFX

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Problème ListView ContextMenu getItem
    Bonjour,

    Je génère automatiquement des listviews d'arraylists et souhaite y intégrer un ContextMenu qui donne cet effet :

    Nom : java_2019-07-30_13-38-56.png
Affichages : 43
Taille : 28,9 Ko

    J'aimerais récupérer l'item sélectionné dans ma liste. Le problème étant l'implémentation du setOnAction() du MenuItem Modify pour chaque listview.

    En essayant d'accéder aux arraylists via une variable final je n'arrive qu'à récupérer l'item sélectionné qu'à partir d'une seule listView.

    Existe t-il un moyen plus propre et plus simple de récupérer l'item saisi dans la listview avec le contextMenu?

    Bonne journée

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    août 2005
    Messages
    6 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : août 2005
    Messages : 6 236
    Points : 22 359
    Points
    22 359
    Billets dans le blog
    48
    Par défaut
    C'est sympa de fournir un code de test ca rend le boulot de ceux qui veulent t'aider un peu plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    package listview.context;
     
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.beans.property.ReadOnlyStringProperty;
    import javafx.beans.property.ReadOnlyStringWrapper;
    import javafx.scene.Scene;
    import javafx.scene.control.ContextMenu;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.MenuItem;
    import javafx.scene.control.SplitPane;
    import javafx.stage.Stage;
     
    import java.util.stream.IntStream;
     
    public final class Main extends Application {
        public static void main(final String... args) {
            launch(args);
        }
     
        @Override
        public void start(final Stage primaryStage) throws Exception {
            selectionProperty().addListener((observable, oldValue, newValue) -> {
                System.out.printf("Selection: %s -> %s%n", oldValue, newValue);
            });
            final int columns = 5;
            final int rows = 5;
            final var root = new SplitPane();
            IntStream.range(0, columns)
                    .mapToObj(column -> {
                        final var listView = new ListView<String>();
                        IntStream.range(0, rows)
                                .mapToObj(row -> String.format("%d - %d", row, column))
                                .forEach(listView.getItems()::add);
                        listView.setCellFactory(list -> new ListCell<>() {
                            private final ContextMenu contextMenu = new ContextMenu();
     
                            {
                                final var selectItem = new MenuItem("Select");
                                selectItem.setOnAction(event -> selection.set(getItem()));
                                contextMenu.getItems().add(selectItem);
                            }
     
                            @Override
                            protected void updateItem(String value, boolean empty) {
                                super.updateItem(value, empty);
                                final var String = value;
                                setText(value);
                                final var contextMenu = empty ? null : this.contextMenu;
                                setContextMenu(contextMenu);
                            }
                        });
                        return listView;
                    })
                    .forEach(root.getItems()::add);
            final var scene = new Scene(root);
            primaryStage.setWidth(800);
            primaryStage.setHeight(600);
            primaryStage.setScene(scene);
            primaryStage.show();
            Platform.runLater(() -> {
                final double dx = 1.0 / columns;
                final var dividerPositions = IntStream.range(0, columns - 1)
                        .mapToDouble(index -> (index + 1) * dx)
                        .toArray();
                root.setDividerPositions(dividerPositions);
            });
        }
     
        private final ReadOnlyStringWrapper selection = new ReadOnlyStringWrapper(this, "selection", null);
     
        public final String getSelection() {
            return selection.get();
        }
     
        private final ReadOnlyStringProperty selectionProperty() {
            return selection.getReadOnlyProperty();
        }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci à toi bouye !

    Yes effectivement c'est plus simple mais le code que je produis est protégé.

    Mon problème était la génération automatique. Je n'ai aucune idée du nombre de colonnes à l'avance et le nombre de lignes. Je n'avais donc aucune attache avec le fxml pour interagir plus facilement avec celui-ci. J'ai finis hier par implémenter un écouteur sur mes listviews qui lorsque l'une d'entre elles est cliqué met à jour une valeur externe. Chaque listview possède maintenant un id. Je récupère la source, l'id et enfin peut récupérer la position cliqué sur la fameuse listeview. Ma question avec ce topic était surtout de savoir s'il était possible de revisiter les fonctions de bases telles que setOnAction() en y implémentant des paramètres.

    Bonne journée

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    août 2005
    Messages
    6 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : août 2005
    Messages : 6 236
    Points : 22 359
    Points
    22 359
    Billets dans le blog
    48
    Par défaut
    Citation Envoyé par ari_boig Voir le message
    Yes effectivement c'est plus simple mais le code que je produis est protégé.
    D'ou l'interret de creer un code minimal permettant de tester la chose similaire a ce que j'ai poste
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    août 2005
    Messages
    6 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : août 2005
    Messages : 6 236
    Points : 22 359
    Points
    22 359
    Billets dans le blog
    48
    Par défaut
    setOnAction() en lui-meme non puisque tu ne peux pas modifier la signature mais par contre rien ne t'empeche d'invoquer ce que tu veux apres avoir recuperer quelques valeurs supplementaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    item.setOnAction(event -> {
       final var value= getItem();
       final var listId = getListView().getId();
       [...]
       jInvoqueMaMethodeQuiVaBienAvecLesParametreQueJeVeux(..................);
    });
    EDIT - de plus je rappelle que comme Java supporte desormais tres bien la programmation fonctionnelle, cette method peut etre un parametre passe en argument du constructeur de la cellule ce qui permet de construire des solutions generiques sans soucis sans pour autant figer les comportement dans la pierre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MyListCell extends ListCell
     
         public MyListCell(LInterfaceFonctionnelle action) {
             [...]
             item.setOnAction(event -> {
                     [...]
                     Optional.ofNullable(action)
                         .ifPresent(func -> func.jInvoqueMaMethodeQuiVaBienAvecLesParametreQueJeVeux(..................));
             );
         }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème listviews vba
    Par Beralienne dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 21/06/2008, 00h49
  2. Problème ListView (grille)
    Par Nuxiz dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 28/12/2007, 20h21
  3. Problème de ContextMenu
    Par fmillox dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/12/2007, 08h33
  4. Problème listview VB6
    Par hdmak dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/04/2007, 13h58
  5. [VB.NET] Problème ListView avec checkbox
    Par elkidos dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/02/2007, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo