Comment puis-je créer un JTextArea avec une largeur spécifiée et la plus petite hauteur possible nécessaire pour afficher tout le texte?

StackOverflow https://stackoverflow.com/questions/4083322

Question

Dans tous les exemples que je peux trouver que l'utilisation d'un JTextArea, on connaît la hauteur et la largeur avant la construction du JTextArea, et si le JTextArea nécessiterait plus de hauteur, il est placé à l'intérieur d'un JScrollPane. De toute évidence, la hauteur de JTextArea dépend de la largeur et le contenu du texte.

Maintenant, ma situation exige que je n'utilise pas JScrollPane, mais plutôt que le JTextArea être juste assez grand pour afficher tout le texte. Lorsque je crée le JTextArea, je sais que le contenu du texte et combien la largeur, il devra travailler avec; Je ne sais pas la hauteur - Je veux que ce soit aussi faible que possible sans couper tout le texte. Cela semble très difficile à accomplir.

Comme une note de côté, le JTextArea sera ajouté à un JPanel qui ne dispose pas d'un gestionnaire de mise en page - il utilise le positionnement absolu selon la taille préférée du composant ajouté. Cela exige que mon JTextArea retournerait les dimensions correctes sur getPreferredSize(). Les dimensions correctes doivent être la largeur que je fournis lorsque je construit, et la hauteur minimale qui est nécessaire pour afficher tout le texte de la largeur disponible.

J'ai trouvé des discussions similaires qui traitent les bizarreries / bugs impliqués dans la JTextArea qui sont parfois résolus en appelant pack() deux fois sur le conteneur parent. Ce n'est pas une option pour moi. Je suis tenté de créer fondamentalement ma propre JTextArea qui prend une largeur et cordes et calcule la hauteur minimale nécessaire en fonction de la largeur et les paramètres de police, mais je pensais que je demanderais tour d'abord, avant de passer le temps de le faire.

Espérons que ma question est claire. Merci à tous pour votre aide!

Était-ce utile?

La solution

  

il utilise le positionnement absolu sur la base de la taille préférée du composant ajouté.

Sons comme le travail d'un gestionnaire de mise en page.

  

Il faut pour cela que mon JTextArea retournerait les dimensions correctes sur getPreferredSize ().

JTextArea textArea = new JTextArea();
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
textArea.setText("one two three four five six seven eight nine ten");
System.out.println("000: " + textArea.getPreferredSize());
textArea.setSize(100, 1);
System.out.println("100: " + textArea.getPreferredSize());
textArea.setSize( textArea.getPreferredSize() );

Autres conseils

import java.awt.*;
import javax.swing.*;

class FixedWidthLabel {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                String pt1 = "<html><body width='";
                String pt2 =
                    "px'><h1>Label Height</h1>" +
                    "<p>Many Swing components support HTML 3.2 &amp;" +
                    " (simple) CSS.  By setting a body width we can cause the " +
                    " component to find the natural height needed to display" +
                    " the component.<br><br>" +
                    "<p>The body width in this text is set to " +
                    "";
                String pt3 =
                    " pixels." +
                    "";

                JPanel p = new JPanel( new BorderLayout() );

                JLabel l1 = new JLabel( pt1 + "125" + pt2 + "125" + pt3 );
                p.add(l1, BorderLayout.WEST);

                JLabel l2 = new JLabel( pt1 + "200" + pt2 + "200" + pt3 );
                p.add(l2, BorderLayout.CENTER);

                JOptionPane.showMessageDialog(null, p);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

La solution décrite dans FixedWidthLabel, en utilisant <html><body width="..." il faudra le programmeur de fournir le message dans le cadre de la chaîne html.

Si le message est quelque chose comme invalid integer: i<0 not allowed, alors le < devra être échappé (codé?), sinon il est impossible de dire comment JLabel interprétera le html.

Cela ajoute de la complexité à cette solution.

Seulement si vous savez que le message ne contient pas de tels caractères, vous Allright.

Eh bien peut-être si vous savez que votre largeur que vous pouvez exécuter des tests et des travaux sur la largeur de chaque caractère de texte est, de cette façon, vous pouvez utiliser une boucle pour déterminer le nombre de caractères correspondent à chaque ligne et le total des caractères qui doivent être montré, vous pouvez ensuite régler la hauteur en fonction du nombre de lignes il y a être.

Supposons que votre texte a 1000 caractères y compris les espaces, et la largeur d'un caractère est équivalent à 4pixels, alors vous pouvez travailler si la largeur est de 400 caractères qui correspondent à 100 sur chaque ligne, par la suite, vous aurez besoin de 10 lignes. Maintenant, supposons que la hauteur est de 10 pour la taille de la police, vous savez maintenant que vous avez besoin de 10 x 10 == 100 pixels, de sorte que votre TextArea doit être 400x100

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top