Как получить высоту введенного текста в JTextArea, пока он вводится пользователем? - PullRequest
1 голос
/ 12 апреля 2019

Я понимаю, что это может звучать как дубликат Как получить высоту введенного текста в 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 Ответ

2 голосов
/ 12 апреля 2019

Это работает с простым трюком, который называется SwingUtilities.invokeLater

Просто измените строку:

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

по линии

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

И это работает! Возможно, TextArea обеспечивает обновление размера после обработки ключевого события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...