Я понимаю, что это может звучать как дубликат Как получить высоту введенного текста в 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);
}
}
Это в основном работает , но не совсем . Проблема заключается в том, что, когда пользователь вводит достаточно символов для переноса строки, предпочтительный размер, по-видимому, не обновляется до следующей записи символа .
Воспроизвести:
- Запустите вышеуказанную программу
- Ввод символов до тех пор, пока курсор не окажется рядом с правым краем, поэтому при следующем нажатии клавиши будет перенос строки
- Нажмите другой символ.
- На этом этапе строка будет перенесена, и высота напечатанного PreferredSize должна быть больше, чем ранее, поскольку в
JTextArea
есть две строки, но это не так.
- Нажмите другой символ. Теперь обновление PreferredSize отражает тот факт, что есть две строки.
- То же самое происходит при удалении символов.
Это ошибка? Что здесь происходит?