¿Cómo puedo crear un JTextArea con un ancho especificado y la menor altura posible, necesario para visualizar todo el texto?

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

Pregunta

En todos los ejemplos que puedo encontrar que el uso de un JTextArea, la altura y la anchura se conoce antes de construir la JTextArea, y si el JTextArea requeriría más de altura, a continuación, se coloca dentro de un JScrollPane. Obviamente, la altura de JTextArea depende de la anchura y el contenido del texto.

Ahora, mi situación requiere que yo no uso un JScrollPane, pero en lugar de que el JTextArea ser lo suficientemente alto como para simplemente mostrar todo el texto. Cuando creo el JTextArea, sé el contenido del texto y la cantidad de ancho que tendrá que trabajar con; No sé la altura - Quiero que eso sea lo más pequeño posible sin cortar cualquiera de los textos. Esto parece muy difícil de lograr.

Como nota aparte, el JTextArea se añadirá a una JPanel que no tiene un controlador de disposición - que utiliza posicionamiento absoluto basado en el tamaño preferido del componente añadido. Esto requiere que mi JTextArea devolvería las dimensiones correctas en getPreferredSize(). Las dimensiones correcto debería ser el ancho que he proporcionado cuando he construido, y la altura mínima que se requiere para mostrar todo el texto con la anchura proporcionada.

he encontrado algunos hilos similares que tratan sobre las rarezas / bugs que participan en el JTextArea que a veces se resuelve llamando pack() dos veces en el contenedor principal. Esto no es una opción para mí. Estoy tentado a crear mi propio básicamente JTextArea que tiene una anchura y una cadena y calcula la altura mínima necesaria en base a la anchura y la configuración de la fuente, pero yo pensé que le pregunte primero antes de pasar el tiempo para hacer eso.

Espero que mi pregunta es clara. Gracias a todos por su ayuda!

¿Fue útil?

Solución

  

que utiliza posicionamiento absoluto basado en el tamaño preferido del componente añadido.

suena como el trabajo de un controlador de distribución.

  

Esto requiere que mi JTextArea devolvería las dimensiones correctas en 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() );

Otros consejos

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 solución descrita en FixedWidthLabel, utilizando <html><body width="..." requerirá el programador para proporcionar el mensaje como parte de la cadena HTML.

Si el mensaje es algo así como invalid integer: i<0 not allowed, entonces el < tendrá que ser escapado (codificada?), de lo contrario no se sabe cómo JLabel interpretará el html.

Esto añade complejidad a esta solución.

Sólo si se sabe que el mensaje no contiene ningún tipo de caracteres, que será Allright.

Bueno, quizás si sabe que su anchura podría ejecutar algunas pruebas y averiguar cómo el ancho de cada carácter del texto, de esa manera se podría utilizar un bucle para determinar cuántos personajes encajan en cada línea y el total de los caracteres que están siendo se muestra, entonces se podría ajustar la altura basada en el número de líneas que hay que ser.

Diga su texto tiene 1000 caracteres incluidos los espacios en blanco, y la anchura de un carácter es equivalente a 4pixels, a continuación, se puede trabajar si el ancho es de 400 que encajan 100 caracteres en cada línea, posteriormente, necesitará 10 líneas. Ahora dicen que la altura es de 10 para el tamaño de la fuente, ahora se sabe que necesita 10 x 10 == 100 píxeles, por lo que su TextArea debe ser 400x100

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top