IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

tableView, impossible de delete un élément


Sujet :

JavaFX

  1. #1
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut tableView, impossible de delete un élément
    Bonjour tous le monde,
    j'ai un problème avec le tableView de javaFX, j'ai besoin de pouvoir y ajouter des éléments, et d'en supprimer, pour ajouter je n'ai pas eu de problème, mais quand je tente de supprimer un élément sélectionné, rien ne se passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @FXML
    public void delbanlist(ActionEvent event) {
    ObservableList<banned> data = tableView.getItems();
    data.remove(tableView.getSelectionModel().getSelectedItems());
    System.out.println(String.valueOf(tableView.getSelectionModel().getSelectedItems()));
    tableView.refresh();
    tableView.setItems(data);
    }
    Si quelqu'un à une idée, merci

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Deux choses :
    1. tableView.getSelectionModel().getSelectedItems() retourne une nouvelle liste observable qu'on nommera A .
    2. data.remove(A) : aucune des versions de remove() de List ou ObservableList ne prend de liste d'objets en paramètre donc là du coup tu essaies de retirer A en tant que valeur. Comme A n'est pas une des valeurs contenues dans la liste des données de la table, rien ne se passe.


    -> Donc tu dois retirer les éléments contenus dans A, pas A elle-même.

    Et enfin puisque tu manipules directement la liste de la table et que c'est une liste observable, tu n'as pas besoin de faire tableView.setItems(data);
    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
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par bouye Voir le message
    Deux choses :
    1. tableView.getSelectionModel().getSelectedItems() retourne une nouvelle liste observable qu'on nommera A .
    2. data.remove(A) : aucune des versions de remove() de List ou ObservableList ne prend de liste d'objets en paramètre donc là du coup tu essaies de retirer A en tant que valeur. Comme A n'est pas une des valeurs contenues dans la liste des données de la table, rien ne se passe.


    -> Donc tu dois retirer les éléments contenus dans A, pas A elle-même.

    Et enfin puisque tu manipules directement la liste de la table et que c'est une liste observable, tu n'as pas besoin de faire tableView.setItems(data);
    Je vois, cependant, quand j'ajoute un élément "0.0.0.0" et que je fais un "data.remove("0.0.0.0");" il ne se passe rien non plus, j'imagine qu'il faut donc choisir l'index d'un élément j'ai donc besoin de récupérer l'ID de l'élément sélectionné et de faire un data.remove(id); ?

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Aucun problème pour ma part :

    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
    final TableView<String> table = new TableView();
    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    final TableColumn<String, String> testColumn = new TableColumn("Test");
    testColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue()));
    table.getColumns().setAll(testColumn);
    table.getItems().add("0.0.0.0");
    final Button button = new Button();
    button.setText("Delete");
    button.setOnAction(actionEvent -> table.getItems().remove("0.0.0.0"));
    VBox root = new VBox();
    root.getChildren().setAll(button, table);        
    Scene scene = new Scene(root, 300, 250);        
    primaryStage.setTitle("Test");
    primaryStage.setScene(scene);
    primaryStage.show();
    Tu as probablement un soucis dans ton code.
    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
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par bouye Voir le message
    Aucun problème pour ma part :

    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
    final TableView<String> table = new TableView();
    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    final TableColumn<String, String> testColumn = new TableColumn("Test");
    testColumn.setCellValueFactory(feature -> new SimpleStringProperty(feature.getValue()));
    table.getColumns().setAll(testColumn);
    table.getItems().add("0.0.0.0");
    final Button button = new Button();
    button.setText("Delete");
    button.setOnAction(actionEvent -> table.getItems().remove("0.0.0.0"));
    VBox root = new VBox();
    root.getChildren().setAll(button, table);        
    Scene scene = new Scene(root, 300, 250);        
    primaryStage.setTitle("Test");
    primaryStage.setScene(scene);
    primaryStage.show();
    Tu as probablement un soucis dans ton code.
    Je vois, pour ajouter des éléments dans mon tableau je m'y prend ainsi:
    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
     
    	public void addbanlist(ActionEvent event) {
    		String ipaddress;
    		String reasonforban;
    		TextInputDialog dialogip = new TextInputDialog("0.0.0.0");
    		dialogip.setTitle("");
    		dialogip.setContentText("IP:");
    		Optional<String> ip = dialogip.showAndWait();
    		ipaddress = ip.get();
    		TextInputDialog dialogreason = new TextInputDialog("Flood.");
    		dialogreason.setTitle("");
    		dialogreason.setContentText("Reason:");
    		Optional<String> reason = dialogreason.showAndWait();
    		reasonforban = reason.get();
    		ObservableList<banned> data = tableView.getItems();
    		String date = getdate();
            data.add(new banned(ipaddress,reasonforban,date));
            ipAddrTable.setCellValueFactory(new PropertyValueFactory<banned, String>("ipaddress"));
            reasonTable.setCellValueFactory(new PropertyValueFactory<banned, String>("reasonforban"));
            dateTable.setCellValueFactory(new PropertyValueFactory<banned, String>("date"));
            tableView.setItems(data);
            tableView.refresh();
    	}
    je vois vraiment pas ou se trouve mon erreur

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Qu'est ce que fait la méthode refresh() et d'où sort-elle ?

    EDIT1 - Marrant une méthode publique que je n'ai jamais utilisée et qui n'est pas dans la javadoc chez Oracle.

    EDIT2 - ok ajoutée dans la 1.8.0u60. Ceci explique pourquoi je ne l'ai jamais utilisée. Et la doc chez Oracle date de la u40 (il y a un ticket sur le bug system à propos du fait qu'elle ne soit pas à jour).

    Callingrefresh() forces the TableView control to recreate and repopulate the cells necessary to populate the visual bounds of the control. In other words, this forces the TableView to update what it is showing to the user. This is useful in cases where the underlying data source has changed in a way that is not observed by the TableView itself.
    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

  7. #7
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par bouye Voir le message
    Qu'est ce que fait la méthode refresh() et d'où sort-elle ?

    EDIT1 - Marrant une méthode publique que je n'ai jamais utilisée et qui n'est pas dans la javadoc chez Oracle.

    EDIT2 - ok ajoutée dans la 1.8.0u60. Ceci explique pourquoi je ne l'ai jamais utilisée. Et la doc chez Oracle date de la u40 (il y a un ticket sur le bug system à propos du fait qu'elle ne soit pas à jour).
    Tu veux dire par la que je ne devrais pas l'utiliser ?

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Aucun problème encore ici :

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    public class Main extends Application {
     
        private TableView<banned> tableView;
        private TableColumn<banned, String> ipAddrTable;
        private TableColumn<banned, String> reasonTable;
        private TableColumn<banned, String> dateTable;
     
        @Override
        public void start(final Stage primaryStage) {
            // Normalement ces initialisations sont faites par le FXMLLoader dans ton cas.
            tableView = new TableView();
            ipAddrTable = new TableColumn<>("ipaddress");
            reasonTable = new TableColumn<>("reasonforban");
            dateTable = new TableColumn<>("date");
            // La plupart de ces instructions devraient être soit dans le FXML soit dans la méthode initialize() du contrôleur dans ton cas.
            tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
            tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            tableView.getColumns().setAll(ipAddrTable, reasonTable, dateTable);
            ipAddrTable.setCellValueFactory(new PropertyValueFactory<banned, String>("ipaddress"));
            reasonTable.setCellValueFactory(new PropertyValueFactory<banned, String>("reasonforban"));
            dateTable.setCellValueFactory(new PropertyValueFactory<banned, String>("date"));
            //
            final Button addButton = new Button();
            addButton.setText("Add");
            // Ce gestionnair d'évent est injecté implicitement par le FXMLLoader.
            addButton.setOnAction(actionEvent -> addbanlist(null));
            final Button deleteButton = new Button();
            deleteButton.setText("Delete");
            // Ce gestionnair d'évent est injecté implicitement par le FXMLLoader.
            deleteButton.setOnAction(actionEvent -> delbanlist(null));
            final VBox root = new VBox();
            root.getChildren().setAll(addButton, deleteButton, tableView);
            //
            final Scene scene = new Scene(root, 300, 250);
            primaryStage.setTitle("Test");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
     
        public void addbanlist(ActionEvent event) {
            String ipaddress;
            String reasonforban;
            TextInputDialog dialogip = new TextInputDialog("0.0.0.0");
            dialogip.setTitle("");
            dialogip.setContentText("IP:");
            Optional<String> ip = dialogip.showAndWait();
            ipaddress = ip.get();
            TextInputDialog dialogreason = new TextInputDialog("Flood.");
            dialogreason.setTitle("");
            dialogreason.setContentText("Reason:");
            Optional<String> reason = dialogreason.showAndWait();
            reasonforban = reason.get();
            ObservableList<banned> data = tableView.getItems();
            String date = getDate();
            data.add(new banned(ipaddress, reasonforban, date));
            tableView.setItems(data);
        }
     
        private String getDate() {
            return LocalDateTime.now().toString();
        }
     
        public void delbanlist(ActionEvent event) {
            final ObservableList<banned> data = tableView.getItems();
            data.removeAll(tableView.getSelectionModel().getSelectedItems());
        }
     
        public static class banned {
     
            private final String ipaddress;
            private final String reasonforban;
            private final String date;
     
            public banned(final String ipaddress, final String reasonforban, final String date) {
                this.ipaddress = ipaddress;
                this.reasonforban = reasonforban;
                this.date = date;
            }
     
            public String getIpaddress() {
                return ipaddress;
            }
     
            public String getReasonforban() {
                return reasonforban;
            }
     
            public String getDate() {
                return date;
            }
        }
     
        public static void main(String[] args) {
            launch(args);
        }    
    }
    Le seul soucis que je vois dans ton code est que tu changes les valueFactory des colonnes à chaque insertion alors qu'en fait cette factory doit être mise en place une seule fois, au début du code(dans la méthode initialize() du contrôleur dans ton cas puisque tu charges un FXML). J'ai remplacé l'appel défectueux à remove() par un appel correct à removeAll(). L'appel à refresh() semble totalement inutile puisque les données contenues dans les valeurs banned ne changent jamais (dans cet exemple). À ce propos ça serait bien de suivre les conventions de nommages habituelles Java : classe banned -> Banned, reasonforban -> reasonForBan, etc. De plus tes noms de colonnes ne sont pas vraiment appropriés, suggestion ipAddrTable -> ipAddrTableColumn ou ipAddrColumn.
    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

  9. #9
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup pour ton aide et tes conseils, tout fonctionne

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    De rien, du coup je me suis rendu compte que j'avais oublié d'enlever :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            ipAddrTable.setCellValueFactory(new PropertyValueFactory<banned, String>("ipaddress"));
            reasonTable.setCellValueFactory(new PropertyValueFactory<banned, String>("reasonforban"));
            dateTable.setCellValueFactory(new PropertyValueFactory<banned, String>("date"));
    de la méthode addbanlist()
    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. menu personnalisés : impossible d'ajouter un élément
    Par alexsolex dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 21/04/2008, 13h43
  2. [SQL] impossible de delete
    Par noobC dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/03/2008, 17h26
  3. Réponses: 10
    Dernier message: 10/03/2008, 08h46
  4. Réponses: 3
    Dernier message: 15/01/2008, 16h51
  5. Réponses: 1
    Dernier message: 28/06/2007, 09h26

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