我正在使用 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 重新验证其单元格大小有任何知识吗?
...除了我发布的方法之外?:)
解决方案:
在一个接一个地搜索方法并测试它们是否能解决我的问题后,我发现在隐藏/显示操作之后执行此代码会导致单元格高度(和宽度)被重新计算,并且没有任何不需要的视觉“闪烁”列表。
list.setFixedCellHeight(0);
list.setFixedCellWidth(0);
list.setFixedCellHeight(-1);
list.setFixedCellWidth(-1);