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] Données Multiligne


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut [JTable] Données Multiligne
    Bonjour,

    J'aimerai savoir comment réalisé un renderer qui permet d'afficher les données sur plusieurs lignes avec retour automatique à la ligne si nécessaire.

    J'ai essayé en passant par un JTextPane mais cela ne fonctionne pas.

    Je souhaiterait trouver un autre moyen que le JLabel avec HTML, car pour mon utilisation ce n'est pas conseillé.

    Je précise que je récupère le texte d'une base de donnée, avec des \n inséré

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Je voulais dire j'ai essayé avec un JTextArea, pas JTextPane

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    il ya a de quoi pourtant avec le JTextArea avec ce qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JTextArea ta = new JTextArea();
    ta.setLineWRap(true);
    ta.setWrapStyleWOrd(true);

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Merci mais j'ai déja mis cela et dans une JTable ca affiche que la 1ere ligne
    J'ai aussi essayé d'allouer une dimension mais rien n'y fait

  5. #5
    Membre expérimenté Avatar de schneidb
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 236
    Par défaut
    Voici le site:

    http://www.codeguru.com/java/articles/139.shtml

    et la ressource:
    http://www.codeguru.com/java/articles/137_tame1.zip

    les fusions fonctionnent un peu comme un tableau html avec cellspan.

    +

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    C'est vrai que le multispan pourrait être une solution à mon pb, mais ce n'est pas vraiment ce que je recherche.
    Je recherche à afficher les données d'une table de base de données dans une Jtable. Sachant que j'ai plusieurs field contenant du texte pouvant être très long et nécessitant l'affichage sur plusieurs lignes.
    En gros je cherche un moyen de faire comme les JTextArea avec le Wrap(true). Sauf que lorque j'implémente un renderer extends d'un JTextArea avec toutes les propriétés adéquates, il ne m'affiche systématiquement que la 1ère ligne de la case.
    De plus l'emploie d'un JLabel HTML avec remplacement des \n par <br> ne va pas car je ne connais pas le contenu du texte donc il y a des problèmes au niveau du wrap et de la largeur de la colonne

  7. #7
    Membre expérimenté Avatar de schneidb
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 236
    Par défaut
    Citation Envoyé par theyankee76
    C'est vrai que le multispan pourrait être une solution à mon pb, mais ce n'est pas vraiment ce que je recherche.
    moi je ne vois pas d'autres réelles solutions, si ce n'est peut être de s'inspirer de ce qui existe pour faire juste ce qu'il te faut

  8. #8
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Par défaut
    Citation Envoyé par theyankee76
    En gros je cherche un moyen de faire comme les JTextArea avec le Wrap(true). Sauf que lorque j'implémente un renderer extends d'un JTextArea avec toutes les propriétés adéquates, il ne m'affiche systématiquement que la 1ère ligne de la case.
    Est ce que toute la donnée est présente dans la ligne ou est ce qu'il en manque ?
    Utilises tu un modéle genre Document ?
    Quelles sont les dimensions de ta JtextArea ? c'est important parce que les autres lignes peuvent être dans la TextArea mais invisibles.

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Il ne m'affiche que la partie avant le 1er \n

    Si j'affiche je JTextArea dans un autre Container que la JTable, j'obtiens bien tout le contenu.

    Peux-tu m'expliquer concernant le Document ?

    Merci de votre aide

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Concernant les dimensions, j'ai essayé de la redimensionner, mais le problème vient de la justement impossible de modifier sa taille. même en lui passant une taille minimale très grande. J'arrive à augmenter sa largeur mais pas sa hauteur, d'où le problème

  11. #11
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Par défaut
    Citation Envoyé par theyankee76

    Peux-tu m'expliquer concernant le Document ?
    tu peux utiliser un PlainDocument (une classe implémentant Document) par exmple comme modèle de donnée pour ta TextArea, dés lors la TextArea est une vue sur ta donnée. Donc si c'était le cas, le problème aurait put venir de la donnée mais vu ce que tu m'as dit :

    Si j'affiche je JTextArea dans un autre Container que la JPanel, j'obtiens bien tout le contenu.
    le problème ne vient pas de là mais plutôt du container voir même du layout du layout de ce container qui doit contraindre ta JtextArea à des dimensions qui ne conviennent pas à ton application.

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Ok je vais regarder du côté des Documents

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Aurais-tu un modèle de PlainDocument faisant ce que je recherche car je ne vois vraiment pas quoi mettre dans la méthode insertString pour qu'il donne la taille voulu au JTextArea


    En tout cas, merci de votre aide

  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    J'ai fait cela mais ca ne passe toujours pas

    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
    64
    65
    66
    67
    68
    69
    70
    71
     
    import java.util.Vector;
    import javax.swing.event.*;
    import javax.swing.text.AbstractDocument;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.Element;
    import javax.swing.text.GapContent;
    import javax.swing.text.Segment;
    import javax.swing.text.Utilities;
    import javax.swing.text.AbstractDocument.Content;
     
    public class MonDocument extends AbstractDocument {
     
    	public static final String tabSizeAttribute = "tabSize";
     
    	public static final String lineLimitAttribute = "lineLimit";
     
    	public MonDocument(Content c) {
    		super(c);
    		putProperty(tabSizeAttribute, new Integer(8));
    		defaultRoot = createDefaultRoot();
    	}
     
    	public MonDocument() {
    		this(new GapContent());
    	}
     
    	public void insertString(int offs, String str, AttributeSet a)
    			throws BadLocationException {
    		super.insertString(offs, str, a);
    	}
     
    	public Element getDefaultRootElement() {
    		return defaultRoot;
    	}
     
    	protected AbstractElement createDefaultRoot() {
    		BranchElement map = (BranchElement) createBranchElement(null, null);
    		Element line = createLeafElement(map, null, 0, 1);
    		Element[] lines = new Element[2];
    		lines[0] = line;
    		map.replace(0, 0, lines);
    		return map;
    	}
     
    	public Element getParagraphElement(int pos) {
    		Element lineMap = getDefaultRootElement();
    		return lineMap.getElement(lineMap.getElementIndex(pos));
    	}
     
    	protected void insertUpdate(DefaultDocumentEvent chng, AttributeSet attr) {
    		super.insertUpdate(chng, attr);
    	}
     
    	protected void removeUpdate(DefaultDocumentEvent chng) {
    		removed.removeAllElements();
    	}
     
    	private void insertComposedTextUpdate(DefaultDocumentEvent chng,
    			AttributeSet attr) {
    	}
     
    	private AbstractElement defaultRoot;
     
    	private Vector added = new Vector(); // Vector<Element>
     
    	private Vector removed = new Vector(); // Vector<Element>
     
    	private transient Segment s;
    }
    Je vois vraiment pas comment faire

  15. #15
    Membre confirmé
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Par défaut
    Désolé, je me suis peût être mal exprimé mais justement, je pense que le problème ne vient pas de la donnée vu que tu as dit ça :

    Si j'affiche je JTextArea dans un autre Container que la JPanel, j'obtiens bien tout le contenu.
    ce qui veux dire que la donnée est bonne (pas besoin de regarder le modèle de type Document même si c'est trés intéressant) donc tu devrait regarder du côté de l'objet qui contient ta jTextArea et voir si celle-ci n'est pas contrainte d'une manière ou d'une autre par cet objet ou le layout manager de cet objet. Le problème est purement graphique semble t-il.

    Pour ce qui est de Document ça te permet d'influer sur la représentation graphique à l'intérieur de la jTextArea mais si celle-ci est trop petite pour certaines raisons je ne pense pas que surcharger insertString te permettent de résoudre ton problème.
    Tu peux par exemple fixer le nombre de caractères maximum dans un jTextArea en surchargeant insertString, en contraignant les insertions sur le modèle tu contraint sans trop te fatiguer la représentation graphique de ce modéle.

    un exemple simple d'utilisation de PlainDocument pour limité le nombre max de caractères dans un textfield ou une textarea :

    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
    class LimitedLengthDocument extends PlainDocument {
     
        int maxLength = 10;
     
        public LimitedLengthDocument() {
            super();
        }
     
        public LimitedLengthDocument(int nbcmax) {
            super();
            maxLength = nbcmax;
     
        }
     
        public void insertString(int offset, String str, AttributeSet s) throws BadLocationException {
     
            if (!(this.getEndPosition().getOffset() > maxLength ) {
                 super.insertString(offset, str, s);
            }
            return;
        }
     
        public void replace(int offset, int l,String str, AttributeSet s) throws BadLocationException {
     
            if (!(offset + str.length() > maxLength)) {
                super.replace(offset, l,str, s);
            }
            return;
        }
     
    }

Discussions similaires

  1. [JTable] Cellules multilignes
    Par mardona dans le forum Composants
    Réponses: 4
    Dernier message: 01/08/2005, 10h27
  2. [JTable] Cellules multilignes dans un jtable
    Par chesteric31 dans le forum Composants
    Réponses: 15
    Dernier message: 06/06/2005, 14h50
  3. [JTable] Perte des données
    Par david71 dans le forum Composants
    Réponses: 8
    Dernier message: 09/01/2005, 00h37
  4. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07

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