Повторная проверка JList - настраиваемые элементы

Я использую JList для хранения данных чата для моей программы чата.
Он использует настраиваемое средство визуализации списка для визуализации настраиваемого объекта JPanel в качестве типа элемента.
Эта панель JPanel содержит две метки JLabel (привязанные к верхней части для имени и времени) и JTextArea (привязанные к нижней части для сообщения чата).

Это выглядит так:

a pic1

Все работает отлично, но я хочу добавить функцию скрытия / отображения.
Используя ранее запрограммированный обработчик PopupMenu, у меня появляется всплывающее окно, когда вы щелкаете правой кнопкой мыши по элементу.

a pic2

Когда вы нажимаете "скрыть" (или "показать", это переключатель), он должен минимизировать элемент, например, так ...

a pic3

Единственная проблема ... он не обновляет размер ячейки JList, поскольку вы можете видеть большая пустая область, где раньше был текст.
Однако, когда я набираю другое сообщение ...

a pic4

JList фиксирует размер ячейки, завершая операцию «скрыть».
Мой вопрос в том, как заставить JList программно перепроверить / перерисовать и т. Д.
И не думайте, что я не пробовал все очевидные решения ...

public void setHidden(boolean hidden) {
    // this is in the custom JPanel class
    System.out.println("Initial: " + this.getPreferredSize());

    // TextArea is the JTextArea which we set invisible when we want to hide it.
    TextArea.setVisible(!hidden); // TextArea is a variable btw
    this.invalidate();
    this.validate();
    this.repaint();

    System.out.println("After: " + this.getPreferredSize());
    container.revalidate();
}

/*
 * This is what the above printlns show when you hide, then show the element.
 *
 * Initial: java.awt.Dimension[width=176,height=38]
 * After: java.awt.Dimension[width=176,height=20]
 * Initial: java.awt.Dimension[width=176,height=20]
 * After: java.awt.Dimension[width=176,height=38]
 */

public void revalidate() {
    // container.revalidate() ^^^
    // list is the list containing the chat elements
    list.invalidate();
    list.validate();
    list.repaint();
}

Пользовательский класс JPanel использует GroupLayout для визуализации компонентов.
У вас есть какие-нибудь знания о том, как программно заставить JList повторно проверять размеры ячеек?
... помимо методов, которые я опубликовал? :)

Решение:
После поиска метода за методом и тестирования, решат ли они мою проблему, я обнаружил, что выполнение этого кода после операции скрытия / отображения приведет к пересчету высоты (и ширины) ячейки без какого-либо нежелательного визуального «мерцания» JList.

list.setFixedCellHeight(0);
list.setFixedCellWidth(0);
list.setFixedCellHeight(-1);
list.setFixedCellWidth(-1);

5
задан Glorfindel 17 August 2019 в 15:25
поделиться