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 :

Problème de dimensionnement de JTextArea dans une JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Par défaut Problème de dimensionnement de JTextArea dans une JTable
    Bonjour,


    J'ai un problème que je comprends pas dans une JTable que j'utilise.
    Mon objectif est de créer une table dans laquelle chaque cellule puisse contenir plusieurs lignes.
    J'ai donc redéfinis mon renderer afin de transformer mes cases en JTextArea. Ca marche pas trop mal... tant que mon texte n'est pas trop long :





    Comme vous avez pu le voir au bout d'un moment il y a des lignes qui sont rajoutées alors qu'il n'y a ni retour à la ligne, ni aucun autre caractère invisible. Mon JTextArea n'a pas la taille attendu ! Les lignes A, A1, A2, et A4 sont correctes, mais la A3 est beaucoup trop grande.

    Pour adapter mes hauteurs de lignes j'utilise simplement :

    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 class MonNouveauRenderer extends JTextArea implements TableCellRenderer {
     
     
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
     
    	/* Mise en forme
    	/* Etc...
    	*/
     
    	// Si mon JText a besoin de place j'aggrandis la ligne de la JTable   
            if (table.getRowHeight(row) < this.getPreferredSize().height)                 
            	table.setRowHeight(row, this.getPreferredSize().height);       
     
            return this;
        }
    }

    J'ai fait mon curieux de manière à afficher les valeurs qui m'intéressaient, je trouve des valeurs cohérentes :


    Case : ligne 0 colonne 0
    46.0 PreferedSize du JTextArea
    16 Taille de la ligne de la JTable

    Case : ligne 0 colonne 1
    29.0 PreferedSize du JTextArea
    46 Taille de la ligne de la JTable

    Case : ligne 0 colonne 2
    29.0 PreferedSize du JTextArea
    63 Taille de la ligne de la JTable


    Plus loin par contre je trouve des valeurs aberrantes pour la hauteur de mes JTextArea :


    Case : ligne 1 colonne 1
    988.0 PreferedSize du JTextArea
    44 Taille de la ligne de la JTable

    Case : ligne 1 colonne 2
    444.0 PreferedSize du JTextArea
    76 Taille de la ligne de la JTable

    Je soupçonne mon problème de venir de ces valeurs mais j'ai bien peur de ne pas comprendre d'où elles sortent, comment la "prefered size" est calculée.
    Au final j'aimerais connaitre la hauteur de mon contenu et pouvoir l'affecter à mes composants qui forment mon renderer.

    Merci d'avance pour vos conseils.
    Raphaël N.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut
    Salut,
    pour ton problème exactement je sais pas, mais moi j'utilise pareil des JTextArea dans une JTable, mais au lieu d'adapter la taille de la cellule au texte, j'ai trouvé comment garder une taille fixe, un retour automatique à la ligne (donc pas scroll bar horizontale), et un ascenceur verticale qui apparait si besoin.



    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
     
    public class DescAreaCellRenderer implements TableCellRenderer {
     
    	private static final long serialVersionUID = -3987688353662913146L;
     
    	public Component getTableCellRendererComponent(	JTable table,
    													Object value,
    													boolean isSelected,
    													boolean hasFocus,
    													int row,
    													int column) {
     
    		System.out.println("Renderer : " + value.getClass());
     
            JTextArea textArea = new JTextArea(value.toString());  
            textArea.setLineWrap(true);
            textArea.setWrapStyleWord(true);
     
            JScrollPane pane = new JScrollPane(textArea);  
            pane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 0));
            pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);  
            return pane;
    	}
    }
    Tu peux définir désormais une taille fixe à chaque ligne, le texte s'adapte. J'espère que ça t'aidera.

    Moi je bosse sur l'édition avec l'Editor, mais ça ne marche pas. Je modifie le texteArea, et quand je quitte la cellule c'est l'ancienne donnée qui s'inscrit, je m'en sors pas....

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Par défaut
    Merci pour l'astuce. Je vais tester mais je ne suis pas sur de pouvoir le faire pour des questions d'ergonomies.



    Pour ton problème de texte qui disparait quand tu changes de cellule, est-ce que tu as bien redéfini toutes les méthodes ?

    Chez moi cela donne un truc du genre :

    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
    63
     
    public class EditorTextArea extends JTextArea implements TableCellEditor {
     
        transient protected ChangeEvent changeEvent = null;
     
        public EditorTextArea() {
     
            this.setLineWrap(true);
            this.setWrapStyleWord(true);
        }
     
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
     
            setText((value == null) ? "" : value.toString());
            setFont(table.getFont());
                setBackground(table.getBackground());
                setForeground(table.getForeground());
            return this;
        }
     
        public Object getCellEditorValue() {
            return getText();
        }
     
        public boolean isCellEditable(EventObject anEvent) {
            return true;
        }
     
        public boolean shouldSelectCell(EventObject anEvent) {
            return true;
        }
     
        public boolean stopCellEditing() {
            fireEditingStopped();
            return true;
        }
     
        public void cancelCellEditing() {
            return ;
        }
     
        public void addCellEditorListener(CellEditorListener l) {
            listenerList.add(CellEditorListener.class, l);
     
        }
     
        public void removeCellEditorListener(CellEditorListener l) {
            listenerList.remove(CellEditorListener.class, l);
        }
     
        // Méthode récupérée et copiée depuis la classe javax.swing.AbstractCellEditor
        protected void fireEditingStopped() {
            Object[] listeners = listenerList.getListenerList();
            for (int i = listeners.length - 2; i >= 0; i -= 2) {
                if (listeners[i] == CellEditorListener.class) {
                    if (changeEvent == null) {
                        changeEvent = new ChangeEvent(this);
                    }
                    ((CellEditorListener) listeners[i + 1]).editingStopped(changeEvent);
                }
            }
        }
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 56
    Par défaut
    Voui je sais que c'est pas évident quand on a une idée en tête de l'adapter, et parfois ce n'est même pas possible, comme tu dis pour des raisons d'ergonomie par exemple. Malheureusement je suis loin d'être assez calé en JTable pour pouvoir te trouver une solution toute faite.
    Je sais pas, il faudrait peut être essayer de redimensionner le JTextArea avant de redimensionner la cellule, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JTextArea.setPrefferedSize (new Dimension (JTextArea.getPrefferedSize ().width, JTextArea.getPrefferedSize ().height);
    JTextArea.setMaximumSize (new Dimension (JTextArea.getPrefferedSize ().width, JTextArea.getPrefferedSize ().height);
    JTextArea.setMinimumSize (new Dimension (JTextArea.getPrefferedSize ().width, JTextArea.getPrefferedSize ().height);
    mais je t'avoue que pour les tailles je ne sais pas trop comment ça fonctionne, donc je faisais ces 3 opérations pour mes composants, et si ça marchait je regardais lesquels étaient nécessaires et lesquels inutiles pour essayer de piter comment ça fonctionne.
    Enfin bon dans l'idée on peut se dire qu'il y a le texte, ensuite on "fit" le JTextArea au texte, et enfin on "fit" la cellule au JTextArea.

    Sinon pour chaque cellule, détecter combien il y a de ligne (par exemple en cherchant combien il y a de caractères '\n' et adapter manuellement la taille de la cellule. Par exemple :
    1 \n => 20 pixels
    2 \n => 40 pxl
    3 \n => 60 pxl

    Mais bon j'avoue c'est vraiment moche si tu dois en arriver là car la solution "élégante" existe, c'est juste qu'on ne sait pas comment et où chercher donc ça serait dommage.


    Pour le texte modifié qui disparaissait on m'a bien aidé et j'ai bien galéré aussi en tatonnant, en fait j'utilisais mal la fonction getCellEditorValue(), maintenant c'est réglé

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Par défaut
    Bon en fait j'ai fait la méthode bourine qui va bien :


    1. Récupérer la taille de la colonne
    2. Calculer si mon texte tiens en une seule ligne (merci Fontmetrics)
    3. Si oui c'est cool
    4. Si non on détecte où on peut couper la première ligne (le dernier caractère espace) et on regarde si le texte restant tient sur une nouvelle ligne
    5. On recommence autant de fois que nécessaire
    6. On a donc le nombre de lignes, avec Fontmetrics on a la hauteur d'une ligne, on sait donc quelle hauteur minimale notre case à besoin
    7. Si la ligne a déjà une taille suffisante on fait rien, sinon on la redimensionne à la bonne hauteur (plus une marge)

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

Discussions similaires

  1. Problème de rafraichissement de JRadioButton dans une JTable
    Par domas_24 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 18/05/2012, 15h35
  2. JTextArea dans une JTable
    Par Deaf dans le forum Composants
    Réponses: 0
    Dernier message: 09/04/2009, 15h49
  3. problème de couleur de cellule dans une JTable
    Par rprom1 dans le forum Composants
    Réponses: 3
    Dernier message: 04/04/2007, 00h01
  4. Problème de refresh dans une JTable
    Par vano dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2006, 14h57
  5. [Jtable] problème de suppression dans une Jtable
    Par gianni17 dans le forum Composants
    Réponses: 1
    Dernier message: 02/12/2005, 18h36

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