Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在用户输入JTextArea时获取输入文本的高度?_Java_Swing - Fatal编程技术网

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谢谢