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 :

[JTable] Label sur plusieurs lignes


Sujet :

Composants Java

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut [JTable] Label sur plusieurs lignes
    Bonjour

    Je voudrais avoir un label sur plusieur ligne dans ma Jtable. Je récupère ce dernier au format html sur plusieur ligne mais j'aimerai que la taille de la ligne s'adapte en fonction du nombre de ligne de mon label (je ne sais pas a l'avance combien je vais avoir de ligne).

    Je pensé faire sa dans le TableCellRenderer mais je trouve pas la methode a appliquer pour changer la taille de ma ligne.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Je te conseillerais d'utiliser plutôt un JTextArea avec setEditable(false) car je ne crois pas que l'on puisses mettre plusieurs lignes dans un JLabel (en tout cas via NetBeans j'ai pas trouvé, ni dans la javadoc mais je me trompe peut-être).

    Ton JTextArea s'il n'est pas dans un JScrollPane pourrais avoir le comportement que tu recherches et, de plus, il est prévu pour posséder plusieurs lignes.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    J'utilisé un label car un JtextArea sa me leve une exception :
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: swing.ListeRendezVousTable$1 cannot be cast to javax.swing.JTextArea

    Voila mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column){
    				System.out.println("Valeur de value : " + value);
                                    //Valeur de value : <html>Entrée portets<br>Au feu a gauche<br>Passage piéton<br>Portail noir sur la gauche<br></html>
    				JTextArea label = null;
    				System.out.println("traitement liste");
                                    // Le problème de Cast est là
    				label = (JTextArea) super.getTableCellRendererComponent(
    						table, value, isSelected, hasFocus, row, column);
     
    				return label;
    			}

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    grrr... problème de réseau, j'ai perdu la réponse que je t'ai faite.

    Bon, le problème c'est que le DefaultRenderer auquel tu fait références s'attend à recevoir un JLabel, sauf que ce que tu veux faire n'est pas un JLabel mais un JTextArea (multiligne). (cf: Tutorial Editor et Renderer)

    Donc tu dois créer ton propre renderer comme celui-ci qui fabrique un ColorRenderer pour afficher une Color, tu devras mettre un JTextArea à la place.

    Juste après, le tutorial explique comment changer le renderer d'une cellule pour une JTable donnée.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    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
    private TableCellRenderer getItiRenderer() {
    		return new DefaultTableCellRenderer(){
    			@Override
     
    			public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column){
    				System.out.println("Valeur de value : " + value);
    				JTextArea label = new JTextArea("");
    				System.out.println("traitement liste");
     
    				if ((String) value != null){
    					label.setText((String)value);
    				}
    				return label;
    			}
    		};
    	}
    Voila mon nouveau render. Dans mon JTable je vois que la première ligne comment j'agrandi la taille de ma ligne?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Là, c'est un problème de hauteur de cellule à priori, et d'auto resize.

    Le truc c'est que si au départ ta cellule ne contient qu'une ligne, il faut lui donner le comportement de s'agrandir automatiquement.

    Déjà, vérifie que ta cellule contient bien un JTextArea avec 2 cellules, en mettant ton JTextArea dans un JScrollBar que renverra donc ton Renderer, c'est juste histoire d'être sûr que ton JTextArea réagi bien.

    Une fois vérifié, tu peux virer le JScrollBar et t'occuper de la taille de la cellule, ou plutôt de la taille de ta ligne (row) et pour celà il existe setRowHeight(int row, int height) de la class JTable.

    Voilà

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    setRowHeight(int row, int height) je doit le mettre dans le render?

    Je vois pas ou le mettre pour avoir le nombre de ligne qui ont été ecrite dans mon Textarea

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Je penses que tu dois pouvoir le mettre dans le getTableCellRendererComponent en faisant un table.setRowHeight(row, plusGrand).

    Il faut tester si la table se repaint automatiquement ou pas et il faut aussi que tu spécifies une valeur pour représenter la taille à ajouter à la ligne.

    Genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plusgrand = monTextArea.getRowCount() * hauteurDuneLigne

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Ok sa marche.

    Par contre un truc me gène. Les print que j'ai mis s'ecrivent sans arret dans ma console, sa veut dire que mon prog appele sans arret le tableCellRender. Sa me semble moyen. Avant il était appelé uniquement quand je fesais un truc sur ma jtable (bouger, selectionner...)

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Les Renderer sont appellé via la gestion des event des listener. Il est possible que le simple fait d'avoir créer ton propre renderer génère un comportement différent et possible aussi que ce soit le composant TextArea lui-même qui déclenche ces évènements.

    Pour le découvrir, met un point d'arrêt dans ton renderer, puis en mode debug, regarde la stack des appels. Tu y trouveras toute la hiérarchie des class/method appellante.

    Check aussi si il n'est simplement pas appelé autant de fois que tu as de lignes dans ta table, car si c'est le cas c'est que tu as une instance de ton renderer par ligne!!

    Là aussi le mode debug en inspectant la pile d'objet t'aidera a mieux comprendre, notamment en vérifiant l'id de chaque renderer de la table courante

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Le mode debug je connais pas trop donc je sais pas faire mater la stack. Comment on regarde la pile des appel sous eclipse?

    Sinon il me semble que c'est le fait de redimentionner la ligne qui rappele le render.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Dans Eclipse, dans ton code, double clic dans la marge, un point rouge apparait, c'est l'endroit ou la JVM va se mettre en pause.

    Ensuite pour lancer ton application en mode debug, clic sur l'icône en forme d'insecte au lieu de la flèche verte.

    Eclipse va éventuellement te demander si tu veux switcher en mode debug ton interface, accepte et lorsque le code entrera dans ta méthode il stoppera au point rouge. Tu pourras continuer en utilisant les icônes de déplacement.

    Il y a une fenêtre Runtime qui indique tout le stack d'appel, ainsi qu'une fenêtre qui te donne toutes les variables et leur valeur, ainsi que les class et leur ID dans leur état actuel.

    Sinon, si c'est le fait de changer la taille qui appel ton renderer, c'est tout à fait normal car le renderer est appellé a chaque fois qu'un évènement de ton composant déclenche une éventuelle modification de ce dernier.

    Raison de plus pour ne pas faire de log (ecrire dans la console) dans ce genre de méthode en dehors d'un debug mode

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Je trouve pas sa très propre de boucler à l'infini sur le render. Je sais pas ce que vous en pensez

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut
    Render n'est pas appellé en boucle infiin. Il est appellé a chaque fois que des event sont généré par ta table tel qu'un clic, une sélection, un mouvement, etc... ce qui est tout a fait normal.

    Beaucoup de composants réagissent de cette façon, d'ailleurs s'il ne le faisait pas on ne pourrais pas spécifié de comportement en fonction d'un event

  15. #15
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Oui il est appelé a chaque redimensionement.

    Mais la vue que j'effectue un redimensionement dans le render on rapelle le render depuis le render et cela de manière récursive.

    Pas beau a mon avis

  16. #16
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 114
    Points : 72
    Points
    72
    Par défaut
    Persone n' d'idée pour mon appel récursif.

Discussions similaires

  1. TileList et Label sur plusieurs lignes
    Par Nexussmb dans le forum Flex
    Réponses: 1
    Dernier message: 19/08/2009, 15h04
  2. écrire le texte d'un label sur plusieurs lignes
    Par sweetdreamer dans le forum Composants VCL
    Réponses: 9
    Dernier message: 03/05/2006, 14h11
  3. [VB.NET] Label sur plusieurs lignes
    Par boulete dans le forum Windows Forms
    Réponses: 11
    Dernier message: 20/04/2006, 17h59
  4. Réponses: 2
    Dernier message: 21/09/2005, 12h18
  5. [JTable] Cellules sur plusieurs lignes
    Par otsgd dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 20/04/2005, 15h25

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