Я использую JList для хранения данных чата для моей программы чата.
Для визуализации пользовательского объекта JPanel в качестве типа элемента используется настраиваемое средство отображения списка.
Этот JPanel содержит две метки JLabel (привязанные к началу, для имени и времени) и JTextArea (привязанные к нижней части, для сообщения чата).
Это выглядит так:
a pic1 http://oi44.tinypic.com/20jiix5.jpg
Все отлично работает, но я хочу добавить функцию скрытия / показа.
Используя ранее запрограммированный обработчик PopupMenu, у меня появляется всплывающее окно, когда вы щелкаете правой кнопкой мыши по элементу.
a pic2 http://oi42.tinypic.com/2m5exxt.jpg
Когда вы нажимаете кнопку скрыть (или показать, это переключение), тогда элемент должен минимизироваться следующим образом:
рис3 http://oi41.tinypic.com/kf3apx.jpg
Единственная проблема ... он не обновляет размер ячейки JList, так как вы видите большую пустую область, где раньше был текст.
Однако, когда я набираю другое сообщение ...
a pic4 http://oi40.tinypic.com/35jdoo7.jpg
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);