JComboBoxのドロップダウンリストを2段に変更する
Total: 644
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JComboBox
のドロップダウンリストのレイアウトに変更してリストアイテムを2
段で表示する
Screenshot
Advertisement
サンプルコード
ComboBoxModel<String> model = makeModel();
int rowCount = (model.getSize() + 1) / 2;
JComboBox<String> combo = new JComboBox<String>(model) {
@Override public Dimension getPreferredSize() {
Insets i = getInsets();
Dimension d = super.getPreferredSize();
int w = Math.max(100, d.width);
int h = d.height;
int buttonWidth = 20; // ???
return new Dimension(
buttonWidth + w + i.left + i.right, h + i.top + i.bottom);
}
@Override public void updateUI() {
super.updateUI();
setMaximumRowCount(rowCount);
setPrototypeDisplayValue("12345");
Accessible o = getAccessibleContext().getAccessibleChild(0);
if (o instanceof ComboPopup) {
JList<?> list = ((ComboPopup) o).getList();
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(rowCount);
Border b0 = list.getBorder();
Border b1 = new ColumnRulesBorder();
list.setBorder(BorderFactory.createCompoundBorder(b0, b1));
list.setFixedCellWidth((getPreferredSize().width - 2) / 2);
}
}
};
View in GitHub: Java, Kotlin解説
JComboBox#getAccessibleContext()#getAccessibleChild(0)
でComboPopup
を取得ComboPopup#getList()
でドロップダウンリストに配置されるJList
を取得- セルの配置方法を垂直方向の次に水平方向の順で並ぶ「ニュースペーパー・スタイル」レイアウトに変更
JList#setMaximumRowCount((model.getSize() + 1) / 2)
で常に2列になるよう最大行数を調整- JComboBoxのドロップダウンリストでセル配置をニュースペーパー・スタイルに設定する
JList
の推奨サイズ中央にColumnRulesBorder
で段間罫線を描画NimbusLookAndFeel
やMotifLookAndFeel
でリストアイテムの幅が段幅を超える場合がある?- マウスカーソルの移動で左右に段がスクロール?する