我正在使用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