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

Composants Java Discussion :

Actualisation d'une JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Par défaut Actualisation d'une JTable
    Bonjour,

    J'ai une JTable dont le nombre de colonne et de ligne varie.
    Afin d'actualiser aprés une action de l'utilisateur, j'ai tenté pas mal de méthode du genre repaint(), revalidate, etc...
    Cependant jle nombre de colonne dépend du contenu d'un fichier xml, donc en gros je pense qu'il faut créer une nouvelle instance du modèle de ma table à chaque changement pour être sur d'avoir le bon nombre de colonne et de ligne.

    Cependant, lorsque je fait mon new Model(); et que je l'applique à ma table, je ne vois aucun changement!

    Comment dois-je m'y prendre ou avez vous une meilleure idée?

    Merci.

  2. #2
    Membre éprouvé Avatar de sylviadesbois
    Inscrit en
    Mars 2007
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 84
    Par défaut
    je suis sure que je vais en faire hurler plus d'un et qu'il y doit y avoir une bien meilleure façon de faire mais si tu supprime ta Jtable de ton composant, que tu la recrée comme tu le souhaites et que tu la rajoute à nouveau, cela fonctionne.
    si tu fonctionalise la création de ta JTable avec en paramètre le nombre de colonnes et de lignes cela est moins fastidieux.

  3. #3
    Membre confirmé Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Par défaut
    Moi j'aime bien ta méthode, je vais tester ça ->
    merci

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    faire mais si tu supprime ta Jtable de ton composant, que tu la recrée comme tu le souhaites et que tu la rajoute à nouveau, cela fonctionne.
    je vais pas crier, ca me fait plutot rire... parceque je suis passé par la .

    la solution (propre) et d'avoir un model pour ta table qui puisse evoluer.

    en voici un (je l'ai resorti d'un vieux projet alors il est pas tout a fait au point mais ca peut servir de depart) :
    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
     
    class TableModel extends AbstractTableModel {
     
    	private static final long serialVersionUID = 1;
            private String[] columnNames = { "Nom", "Prenom", "Montant" };
            private ArrayList<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>();
     
     
            public TableModel( ArrayList<ArrayList<Object>> dat, String[] cols){
            	super();
            	columnNames = cols;
            	data = dat;
            	}
     
            public TableModel( ArrayList<ArrayList<Object>> dat){
            	super();
            	data = dat;
            	}
     
            public void misajour( ArrayList<ArrayList<Object>> dat){
            	data = dat;
            	}
     
            public int getColumnCount() {
                return columnNames.length;
            	}
     
            public int getRowCount() {
                return data.size();
            	}
     
            public void setColumn(String[] column){
            	columnNames = column;
            	}
     
            public String getColumnName(int col) {
                return columnNames[col];
            	}
     
            public Object getValueAt(int row, int col) {
            	ArrayList<Object> v = data.get(row);
                return v.get(col);
            	}
     
            public Class<?> getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            	}
     
            public boolean isCellEditable(int row, int col) {
            	return false;
            	}
     
            public void setValueAt(Object value, int row, int col) {
            	ArrayList<Object> v = data.get(row);
            	v.set(col, value);
                fireTableCellUpdated(row, col);
            	}
     
        }

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Par défaut
    Une autre solution est de créer ton propre TableModel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MYTableModel extends AbstractTableModel [...]
    Suivant tes actions utilisateur tu modifies ton modèle (pense à bien gérer ton conteneur des données ainsi que celui pour les noms de colonnes afin que les modifs soient les plus simples et les plus rapides possibles).

    Tu ajoutes des fonctions dans ton modèle pour gérer tes actions utilisateur qui se termineront toujours par un fireTable......changed() afin que ta vue (ton IHM) puisse être mise à jour automatiquement selon les modifs faites sur le modèle (ton tableau).

    Edit : Mince grillé !

  6. #6
    Membre confirmé Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Par défaut
    Merci à tous d'y prendre un peu de temps.

    En fait j'ai déjà mon tableModel :

    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
     
    public class Model extends AbstractTableModel implements TableModelListener, TableCellRenderer 
    {
     
    	public Model(Gev frame)
    	{
    		fenetre = frame;
    		addTableModelListener(this);
    	}
     
    	public int getColumnCount() 
    	{
    		return fenetre.arbre.tableauColonne.size()+1;
    	}
     
    	public int getRowCount() 
    	{
    		return fenetre.arbre.tableauLigne.size();
    	}
     
    	public Object getValueAt(int rowIndex, int columnIndex)
    	{
    		return fenetre.arbre.getValue(rowIndex, columnIndex);
    	}
     
    	public String getColumnName(int col)
    	{
    		if (col == 0)
    		{
    			return "Lieu";
    		}
    		else
    		{
    			return fenetre.arbre.tableauColonne.get(col-1);
    		}
    	}
     
     
    }
    J'ai épuré le code pour plus de lisibilité.
    Comme vous pouvez le lire, le nombre de colonne et ligne à afficher est contenu dans l'objet "arbre" qui est une instance d'un fichier xml. Celui-là même que l'utilisateur modifie. Je doit surement créer une nouvelle insance de mon xml à chaque changement alors... c'est pas un peu crade ça ?

    De plus j'ai remarqué que la méthode getRowCount() est appelée beaucoup plus souvent que la méthode getColumnCount()...

    Merci.

  7. #7
    Membre confirmé Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Par défaut
    Y'a du nouveau!

    Je me suis rendu compte que le modèle est bien changé, c'est à dire qu'il a le bon nombre de ligne et de colonne, et qu'il demande bien le contenu de chaque case. Alors pourquoi la table ne bouge pas?

    Pourtant j'ai bien fait :

    table.setModel(model);
    table.revalidate();
    table.repaint();

    Il manque quelque chose ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Actualiser la taille d'une Jtable
    Par Ceubex dans le forum Composants
    Réponses: 10
    Dernier message: 13/10/2010, 19h07
  2. focus dans une cellule d'une JTable
    Par coil dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2010, 17h15
  3. Actualiser une JTable
    Par X-plode dans le forum Composants
    Réponses: 4
    Dernier message: 23/04/2007, 11h10
  4. Problème d'actualisation d'une JTable
    Par feasil dans le forum Composants
    Réponses: 4
    Dernier message: 23/03/2007, 10h39
  5. Actualiser une JTable
    Par jojo57 dans le forum Composants
    Réponses: 2
    Dernier message: 06/12/2006, 17h42

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