Я использую JList для хранения данных чата для моей программы чата.
Он использует настраиваемое средство визуализации списка для визуализации настраиваемого объекта JPanel в качестве типа элемента.
Эта панель JPanel содержит две метки JLabel (привязанные к верхней части для имени и времени) и JTextArea (привязанные к нижней части для сообщения чата).
Это выглядит так:
Все работает отлично, но я хочу добавить функцию скрытия / отображения.
Используя ранее запрограммированный обработчик PopupMenu, у меня появляется всплывающее окно, когда вы щелкаете правой кнопкой мыши по элементу.
Когда вы нажимаете "скрыть" (или "показать", это переключатель), он должен минимизировать элемент, например, так ...
Единственная проблема ... он не обновляет размер ячейки JList, поскольку вы можете видеть большая пустая область, где раньше был текст.
Однако, когда я набираю другое сообщение ...
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);