Как я могу создать jtextarea с указанной шириной и наименьшей возможной высотой, необходимой для отображения всего текста?

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

Вопрос

Во всех примерах, которые я могу найти, что используйте JTextArea, высота и ширина известна перед построением JTextArea, и если JTextArea потребуется больше высоты, то он помещен внутри JScrollPane. Отказ Очевидно, высота JTextArea зависит от ширины и текстового содержимого.

Теперь моя ситуация требует, чтобы я не использовал JScrollPane, но вместо этого это JTextArea быть достаточно высоким, чтобы отобразить весь текст. Когда я создаю JTextArea, Я знаю текстовое содержимое и насколько ширина ему придется работать; Я не знаю высота - я хочу, чтобы это было максимально маленьким, не отрываясь от текста. Это кажется очень трудно достичь.

Как побочная записка, JTextArea будет добавлен к JPanel Это не имеет менеджера макета - он использует абсолютное позиционирование на основе предпочтительного размера добавленного компонента. Это требует, чтобы мой JTextArea вернет правильные размеры на getPreferredSize(). Отказ Правильные размеры должны быть шириной, которую я предоставил, когда я построил ее, и минимальная высота, необходимая для отображения всего текста с прилагаемой шириной.

Я нашел несколько подобных потоков, которые обсуждают странности / ошибки, связанные с JTextArea которые иногда решаются, позвонив pack() дважды на родительском контейнере. Это не вариант для меня. Я соблазн в основном создать свой собственный JTextArea Это принимает ширину и строку и вычисляет необходимую минимальную высоту на основе настроек ширины и шрифта, но я решил сначала спросить, прежде чем проводить время, чтобы сделать это.

Надеюсь, мой вопрос понятен. Спасибо за вашу помощь!

Это было полезно?

Решение

Он использует абсолютное позиционирование на основе предпочтительного размера добавленного компонента.

Похоже на работу менеджера макета.

Это требует, чтобы моя jtextarea вернет правильные размеры на getprefredsize ().

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(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);
    }
}

Решение, описанное в FixedWidthlabel, используя <html><body width="..."потребует программиста для предоставления сообщения в составе строки HTML.

Если сообщение что-то вроде invalid integer: i<0 not allowed тогда то < Придется сбежать (закодировано?), В противном случае нет никаких сообщений, как JLabel интерпретирует HTML.

Это добавляет сложность к этому решению.

Только если вы знаете, что сообщение не содержит таких персонажей, вы будете всей.

Ну, возможно, если вы знаете свою ширину, вы могли бы запустить некоторые тесты и работать, насколько широки каждый символ текста, то, как вы можете использовать цикл, чтобы определить, сколько символов подходит для каждой строки, и общий объем символов, которые должны быть показаны, то Вы могли бы установить высоту на основе того, сколько строк есть.

Скажите, что ваш текст имеет 1000 символов, включая пробелы, и ширина символа эквивалентна 4Pixels, то вы можете работать, если ширина 400, что 100 символов подходит для каждой строки, впоследствии вам понадобится 10 строк. Теперь скажите высоту 10 для размера шрифта, теперь вы знаете, что вам нужно 10 х 10 == 100 пикселей, поэтому ваша текстовая пара должна быть 400x100

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top