gpt4 book ai didi

java - 当用户输入文本时,如何获取 JTextArea 中输入文本的高度?

转载 作者:行者123 更新时间:2023-11-30 01:52:21 24 4
gpt4 key购买 nike

我意识到这听起来像是 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);
}
}

这大部分有效但不完全。问题是,当用户输入足够多的字符导致换行时,首选大小似乎不会更新,直到输入下一个字符

重现:

  • 运行上面的程序
  • 输入字符,直到插入符号紧邻右边缘,以便下一次按键将导致换行
  • 按另一个字符。
  • 此时,该行将换行,并且打印的 PreferredSize 的高度应该大于之前的高度,因为 JTextArea 中有两行,但事实并非如此。
  • 按另一个字符。 现在 PreferredSize 会更新以反射(reflect)有两行的事实。
  • 删除字符时也会发生同样的情况。

这是一个错误吗?这是怎么回事?

最佳答案

这需要一个简单的技巧,称为 SwingUtilities.invokeLater

只需更改行:

System.out.println("new preferred: " + text.getPreferredSize());

按行

SwingUtilities.invokeLater(() -> System.out.println("new preferred: " + text.getPreferredSize()));

而且它有效!处理按键事件后,TextArea 可能会提供大小更新。

关于java - 当用户输入文本时,如何获取 JTextArea 中输入文本的高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55653845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com