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: la dernière ligne devient inaccessible aprés suppression


Sujet :

JavaFX

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut TableView: la dernière ligne devient inaccessible aprés suppression
    Bonsoir tout le monde,
    comme indique dans le titre, je ne peux pas sélectionner la dernière ligne après suppression d'une ligne.
    voici le code de la suppression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @FXML
        private void deleteUser(ActionEvent event) {
            User u = userTable.getSelectionModel().selectedItemProperty().getValue();
            if (u != null) {
                em.getTransaction().begin();
                em.remove(u);
                data.remove(u);
                em.getTransaction().commit();
     
            }
     
        }
    ChangeListener:
    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
     private final ChangeListener<User> userListener = (value, oldV, newV) -> {
            if (oldV != null) {
                name.textProperty().unbindBidirectional(oldV.nameProperty());
                mail.textProperty().unbindBidirectional(oldV.emailProperty());
                birthdayPicker.valueProperty().unbindBidirectional(oldV.birthdayProperty());
     
            }
            if (newV != null) {
                name.textProperty().bindBidirectional(newV.nameProperty());
                mail.textProperty().bindBidirectional(newV.emailProperty());
                birthdayPicker.valueProperty().bindBidirectional(newV.birthdayProperty());
     
            }
     
        };
    voici la classe User:
    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
    @Entity
    @Table(name = "USER")
    @NamedQueries({
        @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u"),
        @NamedQuery(name = "User.findByName", query = "SELECT u FROM User u WHERE u.name = :name"),
        @NamedQuery(name = "User.findByEmail", query = "SELECT u FROM User u WHERE u.email = :email")})
    public class User {
     
        private static final long serialVersionUID = 1L;
     
        private final StringProperty name = new SimpleStringProperty();
        private final StringProperty email = new SimpleStringProperty();
        private final ObjectProperty<LocalDate> birthday = new SimpleObjectProperty<>();
     
        public StringProperty nameProperty() {
            return name;
        }
     
        @Id
        @Basic(optional = false)
        @Column(name = "NAME")
        public String getName() {
            return name.get();
        }
     
        public void setName(String name) {
            this.name.set(name);
        }
     
        public StringProperty emailProperty() {
            return email;
        }
     
        @Column(name = "EMAIL")
        public String getEmail() {
            return email.get();
        }
     
        public void setEmail(String email) {
            this.email.set(email);
        }
     
         public ObjectProperty<LocalDate> birthdayProperty(){
            return birthday;
        }
     
        @Column(name = "BIRTHDAY")
        @Temporal(TemporalType.DATE)
        public LocalDate getBirthday() {
            return birthday.get();
        }
     
        public void setBirthday(LocalDate birthday){
            this.birthday.set(birthday);
        }
     
     
     
    }
    ce comportement me parait très bizarre!! pour quoi? je m'explique:
    le problème apparait seulement quand la TableView doit contenir exactement 6 lignes. si je supprime la quatrième ou cinquième ligne, la dernière ligne (forcement la cinquième) devient inaccessible(non sélectionnable). dés que je fais une autre suppression la ligne qui n'était pas inaccessible devient accessible!!.

  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
    Aucun probleme pour moi.

    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
    public class Test_TableDelete extends Application {
     
        public static void main(String[] args) {
            launch(args);
        }
     
        @Override
        public void start(Stage primaryStage) throws Exception {
            final TableView<String> tableView = new TableView();
            tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            for (int index = 0; index < 10; index++) {
                final TableColumn<String, String> tableColumn = new TableColumn(String.valueOf(index));
                tableColumn.setCellValueFactory(param -> {
                    return new SimpleStringProperty(param.getValue());
                });
                tableView.getColumns().add(tableColumn);
            }
            final Button populateButton = new Button("Populate");
            populateButton.setOnAction(actionEvent -> populate(tableView));
            final Button deleteButton = new Button("Delete");
            deleteButton.setOnAction(actionEvent -> removeSelected(tableView));
            final ToolBar toolBar = new ToolBar();
            toolBar.getItems().addAll(populateButton, new Separator(Orientation.VERTICAL), deleteButton);
            final BorderPane root = new BorderPane();
            root.setCenter(tableView);
            root.setTop(toolBar);
            final Scene scene = new Scene(root);
            primaryStage.setScene(scene);
            primaryStage.show();
            //
            populate(tableView);
        }
     
        private void populate(final TableView<String> tableView) {
            tableView.getItems().clear();
            for (int value = 0; value < 6; value++) {
                tableView.getItems().add(String.valueOf(value));
            }
        }
     
        private void removeSelected(final TableView<String> tableView) {
            final int selectedIndex = tableView.getSelectionModel().getFocusedIndex();
            tableView.getItems().remove(selectedIndex);
        }
    }
    Est-ce que ton problème ne viendrai pas plutôt du fait que tu veux sélectionner une ligne qui se trouve être désormais au premier indice ou il n'y a rien (et donc c'est normal qu'on ne puisse rien sélectionner).
    Ou alors c'est un problème avec ta construction voir avec tes binds.
    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 habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    Merci infiniment,
    En réalité, je peux la sélectionner avec la touche flèche en bas par exemple. Mais je ne peux pas faire la même chose avec la souris (voir l'image). si je veux la sélectionner par la souris, je dois supprimer une autre ligne, ou relancer l'application.
    Nom : JPAJavaFX.jpg
Affichages : 183
Taille : 40,6 Ko

  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
    Oui mais justement, je n'ai aucun soucis avec mon test simple tant a la souris qu'avec le clavier donc c'est qu'il y a qq chose dans ton code qui l'en empêche.
    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 habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par bouye Voir le message
    Oui mais justement, je n'ai aucun soucis avec mon test simple tant a la souris qu'avec le clavier donc c'est qu'il y a qq chose dans ton code qui l'en empêche.
    pourriez vous me donner des exemples de code qui peuvent empêcher le clique de la souris sur une ligne.
    voici les codes des méthodes:
    la méthode initialize:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void initialize(URL url, ResourceBundle rb) {
            // TODO
            emf = Persistence.createEntityManagerFactory("persistenceTest");
            em = emf.createEntityManager();
            data = FXCollections.observableArrayList();
            birthdayPicker.setOnAction((ActionEvent evnt) -> {
                birthday = birthdayPicker.getValue();
     
            });
            userTable.getSelectionModel().selectedItemProperty().addListener(userListener);
            configureColumn();
            populate();
        }
    code du button NEW:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     @FXML
        private void newUser(ActionEvent event) {
            userTable.getSelectionModel().clearSelection();
            userTable.getSelectionModel().selectedItemProperty().removeListener(userListener);
            name.clear();
            birthdayPicker.valueProperty().set(null);
            mail.clear();
            userTable.getSelectionModel().selectedItemProperty().addListener(userListener);
        }
    code du button Add:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     @FXML
        private void addUser(ActionEvent event) {
            User u = new User();
            u.setName(name.getText());
            u.setEmail(mail.getText());
            u.setBirthday(birthdayPicker.getValue());
            em.getTransaction().begin();
            em.persist(u);
            em.getTransaction().commit();
            data.add(u);
     
        }
    code de la méthode configureColume:
    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
    private void configureColumn() {
            nameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("name"));
            mailColumn.setCellValueFactory(new PropertyValueFactory<User, String>("email"));
            birthdayColumn.setCellValueFactory(new PropertyValueFactory<User, LocalDate>("birthday"));
            birthdayColumn.setCellFactory(p -> {
                return new TableCell<User, LocalDate>() {
                    @Override
                    protected void updateItem(LocalDate item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item == null || empty) {
                            setText(null);
                        } else {
                            final DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
                            setText(item.format(format));
     
                        }
                    }
                };
            });
     
        }
    code de la méthode populate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void populate() {
            TypedQuery<User> query = em.createQuery(
                    "SELECT e FROM User e", model.User.class);
            List<User> list = query.getResultList();
            data.addAll(list);
            userTable.setItems(data);
            userTable.getSelectionModel().select(0);
     
        }

  6. #6
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    croyez-moi le problème est résolu sans la moindre modification!!

  7. #7
    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
    Euh...

    Bon ceci dit j'ai aussi parfois des problèmes étranges de ce genre qui m'obligent a cleaner complètement un projet avant de rebuilder (parfois Netbeans pète les plombs sans prévenir).
    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

  8. #8
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    je reviens vers vous les gars car le problème n'a pas été résolu. j'ai simplifié le programme en ignorant le JPA et BDD.donc simplement tableView lié à un objet data de type ObservableList<User>. je vous invite à télécharger et à tester (plusieurs fois si possible)le projet suivant:


  9. #9
    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
    Vu. Pour ce que je peux en tester (j'ai nettoyé ton code en long et en large pour ne conserver que le minimum et j'ai aussi modifier le mien pour arriver au même résultat - j'ai mis 100 valeurs dans la table au lieu de 10) c'est effectivement intermittent.

    J'ai créé l'issue RT-40401 - Sometimes TableView cannot select last row after row deletion et on verra si on me répond sur ça.

    Essaie de voir si ça fait pareil quand tu essaies VBox comme conteneur au lieu de BorderPane.
    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

Discussions similaires

  1. [Débutant] DataGridView - C# : Manque une ligne dans DGV après suppression et rafraichissement
    Par Stéphane8 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/04/2015, 11h41
  2. suppression de la dernière ligne vide d'un fichier text en VB6
    Par zcoul dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/07/2007, 19h45
  3. Réactualiser la taille d'un Fichier DBF après suppression de lignes
    Par oiapoque dans le forum Bases de données
    Réponses: 2
    Dernier message: 24/07/2006, 13h52
  4. Problème de taille après suppression de lignes dans un recordset...
    Par nikko_54 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/04/2006, 22h18
  5. [JTable] problème après suppression d'une ligne
    Par fredo3500 dans le forum Composants
    Réponses: 7
    Dernier message: 17/03/2005, 10h01

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