JListがJScrollPane内に組み込まれている場合のビューポートサイズを設定する
Total: 2404
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
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のセルサイズを決定するためのプロトタイプ値を設定する