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
    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 :



    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

    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
    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

    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

    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