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 :

Remove objet dans un TableView


Sujet :

JavaFX

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut Remove objet dans un TableView
    Bonjour,

    J'ai un problème avec la gestion d'une liste observable utilisée dans un TableView.

    Voici un bout de code :
    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
     
    private ObservableList<WrapperRoom> DB = FXCollections.observableArrayList();
     
    //Charge la liste DB à partir de requête SQL...
    DB = loadDB();
     
    public void addTeam(Team t){
            WrapperRoom wr;
            for(Room r:t.getRooms()){
                wr = new WrapperRoom();
                wr.setDate(LocalDate.now());
                wr.setNameTeam(t.getNameTeam());
                wr.setChipNbr(t.getId());
                wr.setGameTime(LocalTime.parse("00:00"));
                wr.setRoom(new Room(r.getNameRoom()));
                DB.add(wr);
            }
    }
     
    public void deleteTeam(Team t){
            t.getRooms().forEach((Room r) -> {
                Predicate<WrapperRoom> wrPredicate = wr -> (wr.getDate().compareTo(LocalDate.now())==0)&&(wr.getNameTeam().equals(t.getNameTeam()))&&(wr.getRoom().getNameRoom().equals(r.getNameRoom()))&&(wr.getGameTime().equals(r.getGameTime()))&&(wr.getChipNbr().equals(t.getId()));
                System.out.println("DB size : "+DB.size());
                DB.removeIf(wrPredicate);
                System.out.println("DB size : "+DB.size());
            });
    }
    Donc, j'ai une liste observable DB. Quand j'ajoute un objet 'WrapperRoom' (-> addTeam) dans ma liste, mon TableView est bien mit à jour directement. Mais dès que je veux enlever un objet à l'aide de la méthode 'removeIf' (-> deleteTeam), mon (mes) objet n'est pas retiré. C'est bien les objets qui ne sont pas retirés de ma liste car j'ai testé avec un DB.size() avant et après l'appel à 'removeIf' et ma liste a tjrs le même nombre d'objets !
    Si je ferme/réouvre mon application et que je veux retirer un objet, ça fonctionne.

    Quelqu'un à une idée ?

    Merci d'avance.

  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
    Ben oui mais jamais tu ne retires des trucs de la table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    final WrapperRoom[] toRemove = t.getRooms()
        .stream()
        .filter(wr -> (wr.getDate().compareTo(LocalDate.now())==0)&&(wr.getNameTeam().equals(t.getNameTeam()))&&(wr.getRoom().getNameRoom().equals(r.getNameRoom()))&&(wr.getGameTime().equals(r.getGameTime()))&&(wr.getChipNbr().equals(t.getId()))
        .toArray(WrapperRoom[]::new);
    // Clear DB.
    Arrays.stream(toRemove).forEach(wr -> {
        [...]
    });
    // Clear table.
    t.getRooms().removeAll(toRemove);
    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
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Bonjour et merci pour ton intervention.

    Mais attention que je souhaite retirer des objets la liste DB et pas de t.getRooms.
    En réalité, t.getRooms est une liste de Rooms. Pour chaque Room de cette liste -> t.getRooms().forEach((Room r) -> {...});, je vérifie dans la liste DB si des WrapperRoom conrrespondent au critères d'une Room. Les critères sont dans le Predicate. Si oui, je retire ce WrapperRoom.
    Et comme dit dans mon message : Si je ferme/réouvre mon application et que je veux retirer un objet, ça fonctionne.

  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
    Tu as bien vérifié dans ce cas que toRemove contient quelques chose à la fin du stream ? Est-ce que ton prédicat est correct ?

    Et du coté de WrapperRoom (on a pas son code), les propriété de la classe sont-elles observables pour que les lignes de la table se mettent à jour quand le contenu de ces objets change ?
    Parce que là clairement tu effectues une action sur ta BD mais aucune action sur la table ou son contenu.
    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
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    J'ai déclaré ma variable 'wrPredicate' à l'extérieur de la boucle for et Bizarrement, ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void deleteTeam(Team t){
            // Permet de supprimer les WrapperRoom dans le DB_TableView
            Predicate<WrapperRoom> wrPredicate;
            for(Room r:t.getRooms()){
                wrPredicate = wr -> (wr.getDate().compareTo(LocalDate.now())==0)&&(wr.getNameTeam().equals(t.getNameTeam()))&&(wr.getRoom().getNameRoom().equals(r.getNameRoom()))&&(wr.getGameTime().equals(r.getGameTime()))&&(wr.getChipNbr().equals(t.getId()));
                DB.removeIf(wrPredicate);
            }
            IEscapeRoom_TeamsDAO escapeRoom_TeamsDAO = AbstractDAOFactory.getFactory().createEscapeRoom_TeamsDAO();
            escapeRoom_TeamsDAO.deleteTeam(t);
            teams.remove(t);
        }
    Encore une petite question bouye : Je dois rafraîchir de temps en temps un TableView quand des données ont été modifiées dans ma DB. Je fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (data != null) {
            data.clear();
    }
    data.setAll(facade.getAllTeams());
    Est-ce la bonne manière de procéder ?

  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
    Ben le soucis est toujours le meme : si les objets du modele ont des proprietes FX ou Beans observables, la mise a jour serait automatique : l'objet est mis a jour avec de nouvelles valeurs -> automatiquement la table set met a jour. Si ce sont des POJO, elle ne peut pas vraiment savoir ce qui a change ou pas sauf en modifiant completement le contenu de la liste (ce que fait ton code).

    Apres il semble qu'il y ait eut un bug dans les version anciennes : JavaFX 2.1 TableView refresh items sur StackOverflow mentionne un bug qui etait ete resolu dans JavaFX 8_60.

    Cette meme version a egalement introduit une nouvelle methode refresh() pour forcer la maj, mais c'est une methode privee .

    EDIT - cette methode revient a faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableView.getProperties().put("tableRefreshKey", Boolean.TRUE);
    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
    Inscrit en
    Janvier 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 100
    Points : 50
    Points
    50
    Par défaut
    Effectivement, je n'ai pas pensé préciser ma situation :
    J'ai 2 pgm bien distinct mais qui utilisent la même DB.
    A un moment, il y a un pgm qui met à jour des datas , qui sont affichées dans un Tableview du second pgm, dans la DB. Dès lors, je souhaite mettre à jour mon tableView avec les 'nouvelles' données de la DB.

    Ma liste utilisée par mon TableView est bien Observable mais dans ce cas précis, c'est cette liste (plus précisément mon tableView) que je veux mettre à jour avec les nouvelles données de la DB.

Discussions similaires

  1. [VB.NET] Suppression d'objets dans une collection
    Par master56 dans le forum VB.NET
    Réponses: 7
    Dernier message: 03/06/2010, 21h46
  2. acceder a un objet dans un CPropertySheet
    Par ludoviskm dans le forum MFC
    Réponses: 6
    Dernier message: 21/11/2004, 08h58
  3. [CR9] redimensionner un objet dans la section détail !
    Par LIM dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 27/04/2004, 18h19
  4. Mettre un objet dans un TListView
    Par FredericB dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/04/2004, 09h32
  5. [arbre] Sauvegarder un objet dans un fichier
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 00h55

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