1

我正在尝试制作一个多列 JComboBox。我环顾四周,这似乎是一件非常棘手的事情。除非有很多人,否则我对有一个表格(在其中选择一行)不感兴趣:我需要消除 JComboBox 中的滚动条,为了实现这一点,我想将其项目放置在多列中列出而不是将它们仅放在一列中。

到目前为止,我最好的选择是这样做:

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

但它不起作用。它仍然将单元格放在一列中。我尝试在设置 LayoutManager 后添加项目,但不影响结果。

任何人都知道如何实现这一目标?

到目前为止,我已经看到 ListCellRenderer 没用。它只指定如何绘制一个单元格(一次一个),而不是如何放置所有单元格(它们彼此的相对位置是什么)。

欢迎任何帮助!

谢谢!

乔丹

4

1 回答 1

2

组合框使用 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条目。您的代码会简单得多,因为您需要做的就是硬编码所需的弹出窗口宽度。

于 2011-03-07T21:56:33.320 回答