如何在用户输入JTextArea时获取输入文本的高度?

时间:2019-04-12 14:25:23

标签: java swing

我意识到这听起来像是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更新以反映存在两行的事实。
  • 删除字符时也会发生同样的事情。

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

1 个答案:

答案 0 :(得分:2)

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

只需更改行:

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

按行

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

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