Swing/VisibleListSizeInScrollPane のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/VisibleListSizeInScrollPane へ行く。
- 1 (2018-03-12 (月) 18:36:23)
- 2 (2020-03-12 (木) 21:10:03)
- 3 (2021-08-31 (火) 16:49:12)
- category: swing folder: VisibleListSizeInScrollPane title: JListがJScrollPane内に組み込まれている場合のビューポートサイズを設定する tags: [JList, JScrollPane, JViewport, JScrollBar] author: aterai pubdate: 2018-03-12T18:30:26+09:00 description: JScrollPane内に組み込まれたJListを表示するために必要なビューポートの推奨サイズを設定します。 image: https://drive.google.com/uc?id=1ajnMnDLpv23H17jLK5NbcE3grdfYGTtWDg
概要
JScrollPane
内に組み込まれたJList
を表示するために必要なビューポートの推奨サイズを設定します。
Screenshot
Advertisement
サンプルコード
String[] model1 = IntStream.range(0, 20)
.mapToObj(Objects::toString)
.toArray(String[]::new);
JList<String> list1 = new JList<>(model1);
list1.setVisibleRowCount(visibleRowCount);
list1.setPrototypeCellValue(prototypeCellValue);
String[] model2 = {"looooooooooooooong"};
JList<String> list2 = new JList<>(model2);
list2.setVisibleRowCount(visibleRowCount);
list2.setPrototypeCellValue(prototypeCellValue);
JList<String> list3 = new JList<String>(model2) {
@Override public Dimension getPreferredScrollableViewportSize() {
Dimension d = super.getPreferredScrollableViewportSize();
d.width = 60;
return d;
}
};
list3.setVisibleRowCount(visibleRowCount);
list3.setPrototypeCellValue(prototypeCellValue);
View in GitHub: Java, Kotlin解説
上記のサンプルでは、レイアウトの方向がVERTICAL
に設定されているJList
がJScrollPane
に組み込まれている場合の表示サイズをテストしています。
- 上段: プロトタイプアイテム(
PrototypeCellValue
)がnull
PrototypeCellValue
がnull
で、fixedCellWidth
とfixedCellHeight
がデフォルトの-1
- 高さ:
JList#getVisibleRowCount()
とfixedCellHeight
が0
の以下なので代わりに固定値16
を掛けた値とJList#getInsets()
のtop
とbottom
を足した値になる- 水平
JScrollBar
の高さは推奨ビューポートの高さに含まれない
- 水平
- 上段左と上段中の幅: それぞれモデル内で最大の幅を持つアイテムの幅が推奨ビューポートの幅になる
- 上段右の幅:
JList#getPreferredScrollableViewportSize()
をオーバーライドして固定値60
を推奨ビューポートの幅に設定
- 下段: プロトタイプアイテム(
PrototypeCellValue
)が設定済み(MMMMMMM
)PrototypeCellValue
が存在し、fixedCellWidth
とfixedCellHeight
が0
以上の値- 高さ:
JList#getVisibleRowCount()
とJList#getFixedCellHeight()
を掛けた値とJList#getInsets()
のtop
とbottom
を足した値になる - 下段左の幅:
JList#setPrototypeCellValue(...)
で設定したプロトタイプアイテムの幅が推奨ビューポートの幅になる- 垂直
JScrollBar
の幅は推奨ビューポートの幅に含まれない
- 垂直
- 下段中の幅:
JList#setPrototypeCellValue(...)
で設定したプロトタイプアイテムの幅が推奨ビューポートの幅になる - 下段右の幅:
JList#getPreferredScrollableViewportSize()
をオーバーライドして固定値60
を推奨ビューポートの幅に設定- 別途
JList#setPrototypeCellValue(...)
で設定したアイテムの幅で文字列が省略されているが、その幅が60
以上なので水平JScrollBar
が表示されている
- 別途
参考リンク
- JList#getPreferredScrollableViewportSize() (Java Platform SE 8)
- JList#setPrototypeCellValue(E) (Java Platform SE 8)
- JComboBoxのセルサイズを決定するためのプロトタイプ値を設定する