Как применить другой LayoutManager к JComboBox?(многостолбцовая попытка JComboBox) - PullRequest
1 голос
/ 07 марта 2011

Я пытаюсь сделать JComboBox с несколькими столбцами.Я немного осмотрелся, и мне кажется, что это очень сложно.Если не много людей, я не заинтересован в наличии таблицы (где вы выбираете строку): мне нужно убрать полосу прокрутки в JComboBox и, чтобы добиться этого, я хочу положить ее элементы в несколько столбцовсписок вместо того, чтобы иметь их только в одном столбце.

Мой лучший выбор до сих пор заключался в следующем:

JComboBox dropdown = new JComboBox(validValues);
CellRendererPane crp = (CellRendererPane) dropdown.getComponent(1);
crp.setLayout(new GridLayout(4, 4)); // for 16 items...

Но это не работает.Он все еще кладет клетки в один столбец.Я попытался добавить элементы после установки LayoutManager, но это не влияет на результат.

Кто-нибудь знает, как этого добиться?

До сих пор я видел ListCellRenderer какбесполезно играть.Он только указывает, как нарисовать ячейку (по одной за раз), а не как расположить их все (каково их взаимное расположение).

Любая помощь приветствуется!

Спасибо!

МДж

1 Ответ

2 голосов
/ 08 марта 2011

Combobox использует JList для рендеринга элементов во всплывающем окне.По умолчанию каждый элемент отображается в одной строке.Вы можете получить доступ к этому списку напрямую, используя:

Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popup  = (BasicComboPopup)child;
JList list = popup.getList();

Теперь, когда у вас есть доступ к списку, вы сможете изменить отображение по умолчанию, используя:

list.setLayoutOrientation(JList.HORIZONTAL_WRAP);

Надеемся, что элементы будуттеперь переносим, ​​когда ширина раскрывающегося списка достигнута.Ширина раскрывающегося списка зависит от ширины поля со списком, поэтому вам может потребоваться поиграть с шириной поля со списком, используя:

list.setPrototypeDisplayValue(....);

Редактировать:

Собственно, забудьтенасчет использования setPrototypeDisplayValue (...), я думаю, вам нужно будет вручную установить размер всплывающего окна.

По умолчанию ширина всплывающего окна всегда равна ширине поля со списком.Вы можете изменить это поведение, используя PopupMenuListener, чтобы переопределить размер всплывающего окна.Чтобы начать, вы можете посмотреть в Combo Box Popup запись.Ваш код будет намного проще, так как все, что вам нужно будет сделать, это жестко задать желаемую ширину вашего всплывающего окна.

...