我正在使用JList为我的聊天程序保存聊天数据。
它使用自定义列表渲染器来呈现自定义JPanel对象作为元素类型。
此JPanel包含两个JLabel(锚定在顶部,名称和时间)和一个JTextArea(锚定在底部,用于聊天消息)。重新验证JList - 自定义元素
它看起来像这样:
a pic1 http://oi44.tinypic.com/20jiix5.jpg
一切都很正常,但我想添加一个隐藏/显示功能。
使用先前编程的PopupMenu处理程序,当右键单击某个元素时,会弹出对话框。
a pic2 http://oi42.tinypic.com/2m5exxt.jpg
当您单击隐藏(或显示,这是一个切换),那么它应该尽量减少像这样的元素...
a pic3 http://oi41.tinypic.com/kf3apx.jpg
唯一的问题是...它不不会更新JList单元格大小,因为您可以看到文本曾经是大的空白区域。
然而,当I型的另一消息......
a pic4 http://oi40.tinypic.com/35jdoo7.jpg
JList的固定单元尺寸完成“隐藏”操作。
我的问题是如何让JList以编程方式重新验证/重新绘制/ etc。
不要以为我没有试过所有的解决方案明显...
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);
请学习java命名约定并坚持到他们 – kleopatra 2012-02-23 09:55:57
我知道java的命名约定,我只是想让我的swing变量大写。但我并不总是遵循这一点...... – 2012-02-23 21:38:20