2011-03-07 70 views
1

我试图制作一个多列JComboBox。我环顾四周,这似乎是一件非常棘手的事情。除非有很多人,否则我不想拥有一个表格(在其中选择一行):我需要消除JComboBox中的滚动条,为了达到这个目的,我想将它的项目放在多列列表中,而不是只将它们放在一列中。如何将另一个LayoutManager应用于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

回答

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

+0

谢谢!几乎所有的工作......直到细胞原型线。我设法有一个巨大的弹出窗口,一个巨大的JList,但JScrollPane(JList所在的)仍然是JComboBox的宽度。我设置的单元格原型(looong JLabel)仅影响单元格的大小(可能是JList;我看到单元格大得多),但不是JScrollPane的宽度(或者是因为JViewport?)。任何想法? – Joanis 2011-03-07 23:56:37

+0

@ M.Joanis,见上面的编辑。 – camickr 2011-03-08 04:29:31