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 :

Line count dans un JTextArea avec setLineWrap(true)


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Par défaut Line count dans un JTextArea avec setLineWrap(true)
    Voila mon soucis, j'utilise un textArea pour afficher les cellules d'un JTable, et je souhaiterai connaitre le nombre de lignes REELLES du JTextArea afin de pouvoir ajuster la tailles de la cellule au contenu. Le problème vient du fait qu'apparament le lineCount ne tient pas du tout compte des lignes coupées.

    A noter que s'il suffifit de changer le composant simplement ou d'avoir directement la taille du JTextArea je suis preneur

    Merci
    @++

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu peux utiliser la méthode split() de la classe String sur le texte de ton JTextArea (le séparateur des lignes réelles doit être '\n').
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Par défaut
    Heu ?? Mouii ??

    En fait je ne controle pas le texte de mon JTextArea, je le met dedans en mettant le line wrap à vrai, ensuite j'aimerai connaitre sa hauteur

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 33
    Par défaut
    Bonjour,

    J'ai le même soucis mais pas trouvé de solution. Tu avais réussi ou pas ?

    Merci

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,

    Tu peux connaitre directement la taille de ton TextArea avec getHeight, getWidth, getBounds....

    Et si tu veux connaitre le nombre de lignes alors

    utilise FontMetrics(Font).getHeight() pour avoir la hauteur d'une ligne

    et textArea.getHeight/FontMetrics(Font).getHeight() pour avoir le nombre de lignes

    voici un petit exemple :

    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
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
     
    public class TestJTextArea extends JFrame implements ActionListener{
     
    	JTextArea textArea = new JTextArea();
    	JButton bouton = new JButton("calcul nombre de lignes et de rangees");
     
    	JLabel lignes = new JLabel();
    	JLabel rangees = new JLabel();
     
     
    	public TestJTextArea() {
    		setSize(500,500);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		bouton.addActionListener(this);
    		JPanel panelNord = new JPanel();
    		JLabel labelLignes = new JLabel("Nombre de lignes : ");
    		JLabel labelRangees = new JLabel("Nombre de rangees : ");
    		JPanel panelLignes = new JPanel();
    		JPanel panelRangees = new JPanel();
    		panelLignes.add(labelLignes);
    		panelLignes.add(lignes);
    		panelNord.add(panelLignes);
     
    		panelRangees.add(labelRangees);
    		panelRangees.add(rangees);
    		panelNord.add(panelRangees);
     
    		add(panelNord,BorderLayout.NORTH);
    		textArea.setLineWrap(true);
    		JPanel panel = new JPanel();
    		panel.add(textArea);
    		add(panel,BorderLayout.CENTER);
    		JPanel panelSud = new JPanel();
    		panelSud.add(bouton);
    		add(panelSud,BorderLayout.SOUTH);
    		setVisible(true);
     
    	}
     
    	public static void main(String[] args) {
    		TestJTextArea tt = new TestJTextArea();
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		lignes.setText(""+textArea.getLineCount());
    		rangees.setText(""+textArea.getHeight()/textArea.getFontMetrics(textArea.getFont()).getHeight());
    	}
    }

  6. #6
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Citation Envoyé par BibiGmi Voir le message
    Voila mon soucis, j'utilise un textArea pour afficher les cellules d'un JTable, et je souhaiterai connaitre le nombre de lignes REELLES du JTextArea afin de pouvoir ajuster la tailles de la cellule au contenu. Le problème vient du fait qu'apparament le lineCount ne tient pas du tout compte des lignes coupées.
    Une row physique n’est pas une line logique marquée par un retour à la ligne.

    Citation Envoyé par BibiGmi Voir le message
    A noter que s'il suffifit de changer le composant simplement ou d'avoir directement la taille du JTextArea je suis preneur
    Surtout que le nombre de lignes ne t'aurait pas donné la réponse puisque tu aurais du en déduire la taille de la cellule à partir de la fonte utilisée, des interlignes, de la bordure du composant... La fête de la décapsulation quoi.

    Deux choses à garder à l’esprit avant de jeter un oeil à la solution :
    - un prototype tel qu’un TableCellRenderer n’est pas utilisé comme un Component usuel, il ne fait notamment pas parti de l’arborescence de composants de la vue ;
    - le retour à la ligne d’un JTextArea ne fonctionne que lorsque la largeur est fixée et que la hauteur ne l’est pas (et c’est logique si tu y réfléchi).


    La solution :

    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
     
    private static void updateAllRowHeight(JTable table, int column) {
    	TableModel model = table.getModel();
    	if (model != null) {
    		for (int row = 0, rowCount = model.getRowCount(); row < rowCount; ++row) {
    			updateRowHeight(table, row, column);
    		}
    	}
    }
     
    private static void updateRowHeight(JTable table, int row, int column) {
    	TableCellRenderer renderer =
    		table.getColumnModel().getColumn(column).getCellRenderer();
     
    	/*
    	 * Rappel : le rendu et uniquement le rendu est en principe
    	 * délégué au composant retourné par un TableCellRenderer.
    	 * On ne l'utilise pour rien d'autre, notamment la mise en page
    	 * des cellules et, plus généralement, la mise en page de la
    	 * hiérarchie de composants de la vue. L'usage qui en est fait
    	 * ici constitue donc une exception.
    	 */
    	Component component = renderer.getTableCellRendererComponent(
    		table,
    		table.getModel().getValueAt(row, column),
    		/*
    		 * Invariance attendue des dimensions du composant
    		 * vis-à-vis du focus et de la sélection. Ce n’est
    		 * pas la mort sinon, ce sera juste moins joli. Il
    		 * est aussi envisageable de tenter les 4
    		 * combinaisons...
    		 */
    		false,
    		false,
    		row, column);
     
    	/*
    	 * Il faut fixer la largeur et laisser libre la hauteur avant
    	 * de demander le calcul de la taille préférée.
    	 */
    	int width = table.getColumnModel().getColumn(column).getWidth();
    	component.setSize(width, Integer.MAX_VALUE);
    	table.setRowHeight(row, component.getPreferredSize().height);
    }
    Le test :

    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
    public static void main(String[] arguments) {
     
    	DefaultTableModel model = new DefaultTableModel(10, 1);
     
    	String text = "Un, deux, trois, quatre, cinq, six, sept, huit, neuf, dix.";
    	StringBuilder content = new StringBuilder(text);
    	for (int i = 0; i < model.getRowCount(); ++i) {
    		model.setValueAt(content.toString(), i, 0);
    		content.append(' ').append(text);
    	}
     
    	final JTable table = new JTable(model);
     
    	table.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {
     
    		private JTextArea textArea = new JTextArea();
     
    		@Override
    		public Component getTableCellRendererComponent(
    			JTable table,
    			Object value,
    			boolean isSelected,
    			boolean hasFocus,
    			int row, int column)
    		{
    			textArea.setLineWrap(true);
    			textArea.setWrapStyleWord(true);
    			textArea.setText((String) value);
    			return textArea;
    		}
    	});
     
    	table.addComponentListener(new ComponentAdapter() {
    		@Override
    		public void componentResized(ComponentEvent arg0) {
    			updateAllRowHeight(table, 0);
    		}
    	});
     
    	JFrame frame = new JFrame();
    	frame.add(new JScrollPane(table));
    	frame.pack();
    	frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    	frame.setVisible(true);
    }

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/07/2011, 13h03
  2. count dans table externe avec une seule requête
    Par gtraxx dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/04/2011, 10h39
  3. Utilisation de COUNT() dans une requete avec 3 table
    Par chych dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/06/2010, 11h54
  4. Pb Count dans une requete avec plusieurs champ retournés
    Par maxos75 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/06/2008, 14h01
  5. [ACCESS] Syntaxe SQL dans un TQuery avec Requestlive=True
    Par Unusual_FL dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/06/2005, 10h51

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