Java 如何在用户输入JTextArea时获取输入文本的高度?
我意识到这听起来像是一个复制品,但事实并非如此 当用户在框中键入时,我试图确定Java 如何在用户输入JTextArea时获取输入文本的高度?,java,swing,Java,Swing,我意识到这听起来像是一个复制品,但事实并非如此 当用户在框中键入时,我试图确定JTextArea的首选高度。为此,根据其他地方的建议,我使用以下代码 import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; public class Main { public static void main(St
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将更新以反映有两行的事实
- 删除字符时也会发生同样的情况
这是虫子吗?这是怎么回事?这是一个简单的技巧,叫做
SwingUtilities.invokeLater
只需更改行:
System.out.println("new preferred: " + text.getPreferredSize());
按部就班
SwingUtilities.invokeLater(() -> System.out.println("new preferred: " + text.getPreferredSize()));
而且它有效!可能TextArea在处理关键事件后提供大小更新。“如何在JTextArea中获取输入文本的高度”为什么(这样做而不是设置行数并将文本区域放入滚动窗格)?JTextArea用作图形应用程序的一部分,在图形应用程序中,它用作浮动在另一个显示器上的文本框。当用户创建“文本框”时,它当然应该随着用户键入文本而扩展!我怎么没想到呢D谢谢