我意识到这听起来像是How to get the height of the entered text in a 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
中有两行,但是没有。这是一个错误吗?这是怎么回事?
答案 0 :(得分:2)
这是一个简单的技巧,称为SwingUtilities.invokeLater
只需更改行:
System.out.println("new preferred: " + text.getPreferredSize());
按行
SwingUtilities.invokeLater(() -> System.out.println("new preferred: " + text.getPreferredSize()));
它有效!可能在处理关键事件后,TextArea会提供大小更新。