Я понимаю, что это может звучать как дубликат Как получить высоту введенного текста в JTextPane?, но это не так.
Я пытаюсь определить предпочтительную высоту JTextArea, пока пользователь вводит текст в поле. Для этого, следуя советам, найденным в другом месте, я использую следующий код
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
public class Main {
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
final JTextArea text = new JTextArea();
text.setLineWrap(true);
text.setWrapStyleWord(true);
text.setColumns(10);
text.getDocument().addDocumentListener(
new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent inDocumentEvent) {
System.out.println("new preferred: " + text.getPreferredSize());
}
@Override
public void removeUpdate(DocumentEvent inDocumentEvent) {
System.out.println("new preferred: " + text.getPreferredSize());
}
@Override
public void changedUpdate(DocumentEvent inDocumentEvent) {
}
}
);
frame.add(text, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
В основном это работает но не совсем. Проблема в том, что когда пользователь вводит достаточное количество символов для переноса строки, кажется, что предпочтительный размер не обновляется до тех пор, пока не появится ввод следующего символа.
Чтобы воспроизвести:
JTextArea есть две строки, но это не так.Это ошибка? Что тут происходит?
JTextArea используется как часть графического приложения, где оно используется как текстовое поле, плавающее поверх другого дисплея. Когда пользователь создает «текстовое поле», оно должно расширяться по мере того, как пользователь вводит текст.




Это работает с помощью простого трюка, называемого SwingUtilities.invokeLater
Просто измените строку:
System.out.println("new preferred: " + text.getPreferredSize());
по линии
SwingUtilities.invokeLater(() -> System.out.println("new preferred: " + text.getPreferredSize()));
И это работает! Вероятно, TextArea обеспечивает обновление размера после обработки ключевого события.
Конечно! Теперь, почему я не подумал об этом? :D Спасибо