Java 如何将另一个LayoutManager应用于JComboBox?(多列JComboBox尝试)

Java 如何将另一个LayoutManager应用于JComboBox?(多列JComboBox尝试),java,swing,jcombobox,layout-manager,Java,Swing,Jcombobox,Layout Manager,我正在尝试制作一个多列JComboBox。我环顾了很多地方,这似乎是一件非常棘手的事情。除非有很多人,否则我对拥有一个表(在其中选择一行)不感兴趣:我需要消除JComboBox中的滚动条,为了实现这一点,我希望将其项放在多列列表中,而不是只在一列中 到目前为止,我的最佳选择是: JComboBox dropdown = new JComboBox(validValues); CellRendererPane crp = (CellRendererPane) dropdown.getCompone

我正在尝试制作一个多列JComboBox。我环顾了很多地方,这似乎是一件非常棘手的事情。除非有很多人,否则我对拥有一个表(在其中选择一行)不感兴趣:我需要消除JComboBox中的滚动条,为了实现这一点,我希望将其项放在多列列表中,而不是只在一列中

到目前为止,我的最佳选择是:

JComboBox dropdown = new JComboBox(validValues);
CellRendererPane crp = (CellRendererPane) dropdown.getComponent(1);
crp.setLayout(new GridLayout(4, 4)); // for 16 items...
但它不起作用。它仍然将单元格放置在单个列中。我尝试在设置LayoutManager后添加项目,但这不会影响结果

有人知道如何做到这一点吗

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

欢迎任何帮助

谢谢


MJ

组合框使用JList在弹出窗口中呈现项目。默认情况下,每个项目显示在一行中。您可以使用以下命令直接访问此列表:

Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popup  = (BasicComboPopup)child;
JList list = popup.getList();
现在您已经访问了列表,您应该能够使用以下命令更改默认显示:

list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setPrototypeDisplayValue(....);
希望在达到下拉列表的宽度时,这些项目现在会自动换行。下拉列表的宽度由组合框的宽度控制,因此您可能需要使用以下方法来调整组合框的宽度:

list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setPrototypeDisplayValue(....);
编辑:

实际上,忘记使用setPrototypeDisplayValue(…),我认为您需要手动设置弹出窗口的大小


默认情况下,弹出窗口的宽度始终等于组合框的宽度。您可以通过使用PopupMenuListener覆盖弹出窗口的大小来修改此行为。要开始,您可以查看条目。您的代码将简单得多,因为您只需硬编码所需的弹出窗口宽度。

谢谢!!!几乎所有的东西都能工作。。。直到细胞原型系。我成功地创建了一个巨大的弹出窗口,一个巨大的JList,但是JScrollPane(JList所在)仍然是JComboBox的宽度。我设置的单元原型(looong JLabel)只影响单元的大小(可能还有JList;我看到单元要大得多),但不影响JScrollPane的宽度(或者是因为JViewport?)。有什么想法吗?