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

Dans tous les exemples que je trouve qui utilisent un JTextArea , la hauteur et la largeur sont connues avant la construction du JTextArea , et si le JTextArea nécessitait plus de hauteur, il est placé à l’intérieur d’un JScrollPane . Évidemment, la hauteur de JTextArea dépend de la largeur et du contenu du texte.

Maintenant, ma situation nécessite que je n’utilise pas JScrollPane , mais que JTextArea soit juste assez grand pour afficher tout le texte. Lorsque je crée JTextArea , je connais le contenu du texte et la largeur avec laquelle il devra travailler. Je ne connais pas la hauteur – je veux qu’elle soit aussi petite que possible sans couper le texte. Cela semble très difficile à accomplir.

En remarque, JTextArea sera ajouté à un JPanel ne disposant pas de gestionnaire de disposition – il utilise un positionnement absolu basé sur la taille préférée du composant ajouté. Cela nécessite que mon JTextArea renvoie les dimensions correctes sur getPreferredSize() . Les dimensions correctes doivent correspondre à la largeur que j’ai fournie lors de la construction et à la hauteur minimale requirejse pour afficher tout le texte avec la largeur fournie.

J’ai trouvé des discussions similaires qui traitent des bizarreries / bugs liés à JTextArea qui sont parfois résolues en appelant pack() deux resockets sur le conteneur parent. Ce n’est pas une option pour moi. Je suis tenté de créer mon propre JTextArea qui prend une largeur et une chaîne et calcule la hauteur minimale nécessaire en fonction de la largeur et des parameters de police, mais j’imaginais que je devrais commencer par le demander avant de prendre le temps de le faire.

J’espère que ma question est claire. Merci à tous pour votre aide!

il utilise un positionnement absolu basé sur la taille préférée du composant ajouté.

Cela ressemble au travail d’un gestionnaire de disposition.

Cela nécessite que mon JTextArea renvoie 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() ); 
 import java.awt.*; import javax.swing.*; class FixedWidthLabel { public static void main(Ssortingng[] args) { Runnable r = new Runnable() { public void run() { Ssortingng pt1 = "

Label Height

" + "

Many Swing components support HTML 3.2 &" + " (simple) CSS. By setting a body width we can cause the " + " component to find the natural height needed to display" + " the component.

" + "

The body width in this text is set to " + ""; Ssortingng 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 et utilisant obligera le programmeur à fournir le message dans le cadre de la chaîne html.

Si le message ressemble à un invalid integer: i<0 not allowed , le < devra être échappé (codé?), Sinon rien ne dit comment JLabel interprétera le code HTML.

Cela ajoute à la complexité de cette solution.

Ce n'est que si vous savez que le message ne contient pas de tels caractères que tout ira bien.

Peut-être que si vous connaissez votre largeur, vous pouvez exécuter des tests et déterminer la largeur de chaque caractère du texte. Vous pouvez ainsi utiliser une boucle pour déterminer le nombre de caractères pouvant être placés sur chaque ligne et totaliser le nombre de caractères à afficher. vous pouvez définir la hauteur en fonction du nombre de lignes à créer.

Supposons que votre texte comporte 1 000 caractères, y compris les espaces, et que la largeur d’un caractère équivaut à 4 pixels, vous pouvez alors déterminer si la largeur est de 400 que 100 caractères conviennent à chaque ligne. Vous aurez ensuite besoin de 10 lignes. Maintenant, disons que la hauteur de la police est de 10, vous savez maintenant que vous avez besoin de 10 x 10 == 100 pixels, votre TextArea doit donc être de 400×100.