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

AWT/Swing Java Discussion :

TableCellRenderer casse tete


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Par défaut TableCellRenderer casse tete
    Salut à tous
    je voudrais changer le rendu de mon JTable. Dans la doc, la démarche est assez simple, il faut créer une classe qui étends l'interface TableCellRenderer et faire un setDefaultCellRenderer pour changer le renderer par défaut.
    Seulement, je suis surpris que mon petit code ne marche pas. le voici

    Je crée tout d'abord un model simple(Tableau de string)
    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
    60
    61
    62
     
    package clientInterfaces;
     
    import javax.swing.event.TableModelListener;
    import javax.swing.table.TableModel;
     
    public class MyJTableModel implements TableModel {
     
    	String[][] data;
    	String[] title;
     
    	MyJTableModel(String[][] tab, String[] t){
    		data = tab;
    		title = t;
    	}
     
    	public void addTableModelListener(TableModelListener arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	public Class<?> getColumnClass(int arg0) {
    		// TODO Auto-generated method stub
    		return data[0].getClass();
    	}
     
    	public int getColumnCount() {
    		// TODO Auto-generated method stub
    		return title.length;
    	}
     
    	public String getColumnName(int arg0) {
    		// TODO Auto-generated method stub
    		return title[arg0];
    	}
     
    	public int getRowCount() {
    		// TODO Auto-generated method stub
    		return data.length;
    	}
     
    	public Object getValueAt(int arg0, int arg1) {
    		// TODO Auto-generated method stub
    		return data[arg0][arg1];
    	}
     
    	public boolean isCellEditable(int arg0, int arg1) {
    		// TODO Auto-generated method stub
    		return true;
    	}
     
    	public void removeTableModelListener(TableModelListener arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	public void setValueAt(Object arg0, int arg1, int arg2) {
    		// TODO Auto-generated method stub
    		data[arg1][arg2] = (String)arg0;
    	}
     
    }
    puis je crée le renderer
    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
    package clientInterfaces;
     
    import java.awt.Component;
     
    import javax.swing.JTable;
    import javax.swing.*;
    import javax.swing.table.TableCellRenderer;
    import java.util.Date;
     
    public class MyJTableRenderer implements TableCellRenderer {
    	JToggleButton t = new JToggleButton();
    	public Component getTableCellRendererComponent(JTable arg0, Object arg1,
    			boolean arg2, boolean arg3, int arg4, int arg5) {
    		// TODO Auto-generated method stub
    		t.setText(((String)arg1));
    		return t;
    	}
     
    }
    puis enfin je teste sur un JTable
    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
    package clientInterfaces;
    import javax.swing.*;
    import java.awt.*;
     
    public class TestJTable {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		String[][] tab = {{"Chaine11", "Chaine12", "Chaine13", "Chaine14"}, {"Chaine21", "Chaine22", "Chaine23", "Chaine24"}, {"Chaine31", "Chaine32", "Chaine33", "Chaine34"}, {"Chaine41", "Chaine42", "Chaine43", "Chaine44"}};
    		String[] title = {"Title1", "Title2", "Title3", "Title4"};
     
    		// TODO Auto-generated method stub
    		JTable jtab = new JTable(new MyJTableModel(tab, title));
    		jtab.setDefaultRenderer(String.class, new MyJTableRenderer());
    		jtab.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    		JScrollPane jsp = new JScrollPane(jtab);
    		JFrame fen = new JFrame("Ma JTable Frame");
    		fen.getContentPane().setLayout(new GridLayout());
    		fen.setPreferredSize(new Dimension(500, 500));
    		fen.add(jsp);
    		fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fen.setVisible(true);
    	}
     
    }
    Je sais pas quelle erreur j'ai commise dans ce code mais mon JTable n'affiche pas du tout les cellules sous forme de JToggleButton mais toujours des JLabel. S'il ya une autre methode ou si quelqu'un décelle une erreur, please faite un signe, ça me rend malade

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    La méthode getColumnClass() de ton modèle est incorrecte : elle retourne String[] et non pas String !

    De plus tu ne gère pas les listener sur ton modèle (et la classe DefaultTableModel pourrait très bien te convenir).

    Enfin ton TableCellRenderer n'est pas très optimisé : il y a plusieurs méthodes à redéfinir pour éviter des traitements inutiles et trop fréquents. Tu peux voir la doc de la classe DefaultTableCellRenderer pour plus de détail (toutes les méthodes marqué "Overridden for performance reasons." sont redéfini avec un corps vide)

    a++

  3. #3
    Membre confirmé Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Par défaut
    Ok je vais essayer de corriger ça. Merci

  4. #4
    Membre confirmé Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Par défaut
    Salut, et merci à toi adiGuba
    effectivement je renvoyais un String[] plutot qu'n String. J'ai corrigé et ça s'est un tout petit peu affiché.
    Il reste quand même un prob. c'est que j'arrive pas à modifier la taille du composant qui s'affiche en lieu et place de la cellule(c'est à dire le JToggleButton). j'ai beau faire des setSize, setPreferredSize sur le JToggleButton avant de le retourner mais rien n'y fais, le bouton s'affiche, mais sa taille est toujours celle du JLabel normal , et je voudrais l'agrandir. Es-ce possible de modifier la taille du composant qui s'affiche? et comment?

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yashiro Voir le message
    Es-ce possible de modifier la taille du composant qui s'affiche? et comment?
    Tu dois modifier la taille de la cellule en passant par le TableColumnModel.
    Le renderer s'adaptera toujours à la taille de la cellule...

    a++

  6. #6
    Membre confirmé Avatar de yashiro
    Inscrit en
    Mars 2004
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 214
    Par défaut
    Salut et merci pour ta patience....
    J'ai fais un tour sur le lien que tu m'as proposé pour le redimensionnement des cellules.
    je n'y ai repéré qu'une fonction dont le nom fait allusion au redimensionnement des cellules, il s'agit de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int getTotalColumnWidth()
    j'ai l'impression (vu son nom) qu'elle ne traite que de la largeur des cellules, le truc c'est que je voudrais aussi jouer sur la hauteur des cellules y aurait-il un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int getTotalRowWidth()
    par hasard???

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

Discussions similaires

  1. [Bloqué]Macro autoexec casse tete
    Par torNAdE dans le forum Access
    Réponses: 24
    Dernier message: 12/07/2006, 15h09
  2. Tube nommé: un casse tête
    Par yashiro dans le forum Linux
    Réponses: 2
    Dernier message: 28/06/2006, 09h11
  3. Requete Casse tete... Help..
    Par Jerome218 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/01/2006, 05h57
  4. casse tete de requete
    Par moutey dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/12/2004, 14h00
  5. [casse-tete (pour moi)] recuperer la largeur d'un <div>
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 05/11/2004, 07h39

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