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 :

Mise à jour des noms d'en-têtes + Ajustement largeur des colonnes


Sujet :

Composants Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut Mise à jour des noms d'en-têtes + Ajustement largeur des colonnes
    Bonjour,

    tout d'abord, un petit point sur ce que j'ai réussi à obtenir :
    - je suis dans une fenêtre héritant de JDialog implémentant ActionListener, DocumentListener, ItemListener, TableModelListener
    - une JTable, comportant un tableau héritant de AbstractTableModel
    - cette JTable est dans un JScrollPane

    L'utilisateur effectue une recherche parmi une liste d'articles :
    - il complète des JTextFields correspondant à différents champs (il peut faire des recherches en appliquant différents "filtres")
    - il choisit les colonnes à afficher parmi une liste de champs : ainsi, il peut choisir de n'afficher que la référence et la désignation, ou bien encore le prix en plus, etc...
    - il appuie sur "Entrée" ou bien clique sur un bouton "Rechercher"
    - la JTable affiche tous les articles correspondants

    SAUF QUE c'est ici qu'arrive mon problème... Les en-têtes des colonnes ne se mettent pas à jour. Alors que les données, elles, se mettent à jour...
    Je garde les noms de colonnes correspondant à des lettres (A, B, ...)

    Un pitit bout de code pour y voir plus clair :

    - lors d'un clic sur le bouton rechercher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    modelTabArt = new TableArticle(tableauStringDeuxDimensions, tableauDeCheckBox); 
    // la variable TableArticle hérite de AbstractTableModel
    // le tableau de checkbox permet de savoir quels champs/quelles colonnes afficher
    // ce constructeur permet d'afficher tous les articles correspondants, avec le bon nombre de colonnes
    tabArt.setModel(modelTabArt);
    tabArt.updateUI();
    - les parties intéressantes de TableArticle :
    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
     
    public class TableArticle extends AbstractTableModel{
     
    	private String[][] data;
    	private String[] title;
     
    //......
     
    public TableArticle(String[][] ListeArticlesSelectionnes, JCheckBox[] tabCheck)
    	{
    		//Le code ici est un peu long, en gros, il récupère les bonnes données, et les bonnes en-têtes
    //(un petit "sysout" m'a permis d'en être sûr ! Aucun problème de ce côté)
     
    		this.title = entetes;// String[]
    		this.data = dataTmp;// String[][]
     
    //informer le tableau des changements de données
    //avant que je mette "updateUI()", cette ligne permettait d'informer du changement en amont
    //mais maintenant, en commentaire ou pas, le changement s'effectue
    		//this.fireTableDataChanged();
     
    //informer le tableau du changement de structure (normalement)
    //mais pareil, aucun changement si je le mets en commentaire
    		this.fireTableStructureChanged();
    	}
     
    //......
     
    }
    Voili voilou, je ne comprends donc pas pourquoi les en-têtes ne se mettent pas à jour, alors que les données, elles, se mettent.



    D'autre part, les colonnes ont toutes la même largeur alors le texte contenu dans chaque cellule lui, n'a pas la tout le temps (jamais en fait) la même largeur (la description, beaucoup plus large que la référence par exemple).

    Par conséquent, après des recherches sur Internet (), je suis tombé sur ça :
    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
     
    public void tableChanged(TableModelEvent e) {
    		tabArt.tableChanged(e);
    		TableColumnModel modelecolonne= tabArt.getColumnModel();
    		TableModel modele = tabArt.getModel();
    		int total=modelecolonne.getColumnCount();
    		for(int i=0;i<total;i++){
    			int taille=0;
    			int total2=modele.getRowCount();
    			for(int j=0;j<total2;j++){
    				// Partie determinant la taille de la cellule de ligne j et de colonne i
    				int taille2=modele.getValueAt(j,i).toString().length()*7;	// determination arbitraire
    				if(taille2>taille){
    					taille=taille2;
    				}
    			}
    			modelecolonne.getColumn(i).setPreferredWidth(taille);
    		}
    	}
    Sur le principe j'ai bien compris tout le code, ce n'est qu'un parcours des différentes largeurs, où on ressort avec le maximum.

    J'ai ajouter donc dans mon constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.tabArt.getModel().addTableModelListener(this);
    tabArt étant une JTable.

    Mais aucun changement à l'horizon au moment du changement de Model...



    Donc voilà, déjà merci d'avoir pris le temps de vous arrêter là-dessus, et bien entendu, si quelqu'un à une solution à apporter à un, ou à ces deux problèmes, je suis preneur !!!

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut Up
    Un petit Up

    Personne qui aurait ne serait-ce qu'une piste ?

    J'ai toujours rien trouvé de satisfaisant...

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut
    Première partie répondue :
    "
    Bon… Vous ne voyez plus les titres des colonnes. Ceci est dû au fait que vous n'avez redéfini que les méthodes abstraites de la classe AbstractTableModel. Si nous voulons voir nos titres de colonnes apparaître, il faut redéfinir la méthode getColumnName(int col). Elle devrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /**
    * Retourne le titre de la colonne à l'indice spécifié
    */
    public String getColumnName(int col) {
      return this.title[col];
    }
    "

    Bin du coup, j'ai rajouté ça dans TabArticle, simple copier-coller, sans rien modifier, et ça marche !

    Ensuite, le code était bon, je l'ai simplement déplacé, et je l'ai mis à la suite du code après le bouton "rechercher"

    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
     
    tabArt.setModel(modelTabArt);
     
    TableColumnModel modelecolonne= tabArt.getColumnModel();
    TableModel modele = tabArt.getModel();
    int total=modelecolonne.getColumnCount();
    for(int i=0;i<total;i++){
        int taille=0;
        int total2=modele.getRowCount();
        for(int j=0;j<total2;j++){
            // Partie determinant la taille de la cellule de ligne j et de colonne i
            int taille2=modele.getValueAt(j,i).toString().length()*7;   // determination arbitraire
            if(taille2>taille){
                taille=taille2;
            }
        }
        modelecolonne.getColumn(i).setPreferredWidth(taille);
    }
     
    tabArt.updateUI();

    Voilà, finalement tout est ok, je mis les réponses ici, des fois que ça serve à quelqu'un d'autre...

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/09/2014, 11h11
  2. Réponses: 4
    Dernier message: 23/02/2011, 09h25
  3. mise à jour du nom d'un fichier
    Par aectie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 07/02/2011, 16h09
  4. Réponses: 6
    Dernier message: 24/11/2008, 20h51
  5. Mise à jour des noms des variables
    Par stefsas dans le forum SAS Base
    Réponses: 1
    Dernier message: 09/06/2008, 11h28

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