Как я могу создать jtextarea с указанной шириной и наименьшей возможной высотой, необходимой для отображения всего текста?
-
28-09-2019 - |
Вопрос
Во всех примерах, которые я могу найти, что используйте 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 &" +
" (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