Как я могу создать JTextArea с указанной шириной и наименьшей возможной высотой, необходимой для отображения всего текста? - PullRequest
12 голосов
/ 03 ноября 2010

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 03 ноября 2010

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

Походит на работу менеджера по расположению.

Это требует, чтобы мой JTextArea возвращал правильные размеры в 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() );
5 голосов
/ 04 ноября 2010
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);
    }
}
0 голосов
/ 11 июля 2011

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

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

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

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

0 голосов
/ 03 ноября 2010

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

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

.
...