チャット プログラムのチャット データを保持するために JList を使用しています。
カスタム リスト レンダラーを使用して、カスタム JPanel オブジェクトを要素タイプとしてレンダリングします。
この JPanel には、2 つの JLabels (名前と時刻用に上部に固定) と 1 つの 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);