Я использую JTextArea для отображения длинного текста
JTextArea _definition = new JTextArea(5, 50);
с переносом слов
_definition.setLineWrap(true);
_definition.setWrapStyleWord(true);
встроенный в JScrollPane
add(new JScrollPane(_definition), gbc);
Все это является частью JPanel с GridBagLayout.
Все работает нормально с более коротким текстом, но когда я добавляю длинный текст с переносом строк и требуется полоса прокрутки, pack () идет на юг, и все компоненты имеют минимальный размер, и диалог становится непригодным (не только TextArea затронутый).
Я пытался понять, что происходит, но все, что я мог понять, это связано с текстом в TextArea. Я застрял .. есть идеи? Спасибо!




Попробуйте дважды вызвать pack(). JTextArea имеет странное поведение как описано в этой записи в базе данных ошибок Java. Первоначально он сообщает свой предпочтительный размер как однострочную запись, которая очень широка (например, одна строка, тысяча столбцов). Как только он поймет, что это определенная ширина, он сообщит правильный предпочтительный размер для необходимого количества строк.
Мне пришлось сделать несколько разных вещей, чтобы обойти это поведение, в том числе создать подкласс JTextArea и изменить его поведение, чтобы оно было немного умнее. Двойной pack() может сработать для вас в этом случае, или вам, возможно, придется прибегнуть к более сложной настройке в зависимости от того, как все в вашем макете сочетается друг с другом.
Первым шагом, вероятно, будет попытка создать подкласс JTextArea и отслеживать каждый раз, когда вызываются методы get * Size (), и посмотреть, соответствуют ли результаты тем, которых вы ожидаете.
Получил, чтобы работать ... Ответ Росс давал мне несколько лучших терминов для поиска, так что спасибо за помощь, указав в правильном направлении!
pack();
_definition.setSize(_definition.getPreferredSize());
pack();
Так что двойная упаковка плюс какое-то дополнительное ... странное поведение.
Двойная упаковка () не сработала для меня .. не могли бы вы подробнее рассказать о "более сложной настройке" .. спасибо!