Swing/TwoColumnsComboPopup のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TwoColumnsComboPopup へ行く。
- 1 (2023-08-28 (月) 07:44:41)
- category: swing folder: TwoColumnsComboPopup title: JComboBoxのドロップダウンリストを2段に変更する tags: [JComboBox, JList, JPopupMenu, Border] author: aterai pubdate: 2023-08-28T07:43:46+09:00 description: JComboBoxのドロップダウンリストのレイアウトに変更してリストアイテムを2段で表示する image: https://drive.google.com/uc?id=1__jrNNiwQkWDlF79S88zv3rKhSUvc3Ci
概要
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
でリストアイテムの幅が段幅を超える場合がある?- マウスカーソルの移動で左右に段がスクロール?する