Effacer affichage JTable avec modèle dynamique

[Résolu]
Signaler
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013
-
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
-
Bonjour,

j'ai créé une JTable avec un modèle dynamique.
Je remplis cette JTable avec les données de ma base de données.

J'ai une JComboBox que je veux utiliser pour filtrer les données.
J'affiche donc les valeur d'un champ de ma base de données dans la JComboBox et j'effectue une requête SQL pour filtrer et j'affiche le résultat dans ma JTable.

Ceci marche très bien sauf que j'aimerai que les données précédemment affichées dans la JTable ne soient plus affichées.

Savez-vous comment faire ?

Merci.
Bonne journée.

9 réponses

Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
Maintenant, si tu as une sorte d'identifiant pour tes heu... Ami, tu peux aussi faire qqch comme ça:

public void updateTable(List pAmisToDisplay)
{
    //remove unessecary objects
    for (int i=0; i<getRowCount(); i++) {
        //TODO si datas.get(i) n'est pas dans pAmisToDisplay
        datas.remove(i);
        //reduire i, il va etre augmenter en fin de boucle
        i--;
    }

    //add additionnal objects
    for (int i=0; i<pAmisToDisplay.size(); i++) {
        //TODO si pAmisToDisplay.get(i) n'est pas dans datas
        datas.add(i, pAmisToDisplay);
    }

    fireTableDataChanged();
}
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
Salut,

cela doit être fait dans ton TableModel... Et la, ça dépends de ton implémentation de ce dernier...
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Merci pour ta réponse.

La seule fonction que j'ai qui peut supprimer quelque chose c'est
 public void removeAmi(int rowIndex) {
    	datas.remove(rowIndex);

        fireTableRowsDeleted(rowIndex, rowIndex);
    }

mais je n'arrive pas à l'utiliser.

Est-ce qu'il faut que je crée une autre méthode dans ma classe TableModel ?
Si oui, comment ?
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
Comme ça, je te dirais de faire une méthode
public void removeAllAmis() {
    //Je suis parti du principe que datas était une List...
    datas.clear();
    fireTableDataChanged();
}


concernant le problème d'utilisation, peut-être un soucis de cast...

((MyModel)table.getModel()).removeAllAmis();
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Au lieu de dire Ami, on va dire Data.

Il y a un problème de type dans ce que tu as fais.
A la ligne :
 datas.add(i, pDataToDisplay);


Apparemment List<Data> devrait être du type Data.
Et si je le déclare comme type de donnée, il n'y a plus d'erreur.
Par contre, lorsque j'utilise la fonction :
modeleDynamique.updateTable(donneeFiltreeJComb);

ça me marque :
java.util.Vector cannot be cast to Data

sachant que donneeFiltreeJComb est de ce type :
[[val1, val2, val3, val4], [val11, val12, val13, val14]
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
tu as un vecteur de vecteur, autrement dit : Vector<Vector>
tu dois donc changer la signature de la methode update:

public void updateTable(Vector<Vector> pDatas)
{ ... }
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Ca ne marche toujours pas.
La méthode datas.add(int, Data) n'accepte pas Vector<Vector> comme paramètre.

Du coup je mets mon code de la classe modeleDynamique :
public class ModeleDynamiqueBDD extends AbstractTableModel {

    private final List<DataBDD> datas = new ArrayList<DataBDD>();
    private final String[] entetes = {"Nom", "Ville", "Code_Postal"};
    
    public ModeleDynamiqueBDD(){
    	super();    	
    }
    
    public int getRowCount() {
        return datas.size();
    }

    public int getColumnCount() {
        return entetes.length;
    }

    public String getColumnName(int columnIndex) {
        return entetes[columnIndex];
    }


private String NOM;
private String VILLE;
private String CODE_POSTALE;
private String TYPE_EXPLOITATION;

    
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch(columnIndex){
            case 0:
                return datas.get(rowIndex).getNOM();
            case 1:
                return datas.get(rowIndex).getVILLE();
            case 2:
                return datas.get(rowIndex).getCODE_POSTALE();
            case 3:
                return datas.get(rowIndex).getTYPE_EXPLOITATION();
            default:
                return null; //Ne devrait jamais arriver
        }
    }

    public void addData(DataBDD dataBDD) {
    	datas.add(dataBDD);

        fireTableRowsInserted(datas.size() -1, datas.size() -1);
    }

    public void removeData(int rowIndex) {
    	datas.remove(rowIndex);

        fireTableRowsDeleted(rowIndex, rowIndex);
    }
//////////////////////////////////////////////////////////////////////////////////////////////    

    public void updateTable(Vector<Vector> pDataToDisplay)
    {
        //remove unessecary objects
        for (int i=0; i<getRowCount(); i++) {
            //TODO si datas.get(i) n'est pas dans pDataToDisplay
            datas.remove(i);
            //reduire i, il va etre augmenter en fin de boucle
            i--;
        }

        //add additionnal objects
        for (int i=0; i<pDataToDisplay.size(); i++) {
            //TODO si pDataToDisplay.get(i) n'est pas dans datas
            datas.add(i, pDataToDisplay);
        }

        fireTableDataChanged();
    }

}
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Finalement, j'ai enlevé la deuxième partie de ta fonction et n'ai pas mis de paramètre dans la signature.
Ça marche exactement comme je voulais.

Voici le code :
public void updateTable()
    {
        //remove unessecary objects
        for (int i=0; i<getRowCount(); i++) {
            //TODO si datas.get(i) n'est pas dans pDataToDisplay
            datas.remove(i);
            //reduire i, il va etre augmenter en fin de boucle
            i--;
        }

    }
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
11
si jamais, le probleme venait surement du fait que ta list est typée DataBDD..
tu aurais donc du avoir une vector de DataBDD, Vector<DataBDD>...