【问题标题】:How to apply another LayoutManager to a JComboBox? (multi-column JComboBox attempt)如何将另一个 LayoutManager 应用到 JComboBox? (多列 JComboBox 尝试)
【发布时间】:2011-07-10 15:33:55
【问题描述】:

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

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

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

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

有人知道如何实现这一点吗?

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

欢迎任何帮助!

谢谢!

乔丹

【问题讨论】:

    标签: java swing jcombobox layout-manager


    【解决方案1】:

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

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

    现在您可以访问该列表,您应该可以使用以下方法更改默认显示:

    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    

    希望当达到下拉菜单的宽度时,这些项目现在会换行。下拉菜单的宽度由组合框的宽度控制,因此您可能需要使用组合框的宽度:

    list.setPrototypeDisplayValue(....);
    

    编辑:

    其实不用setPrototypeDisplayValue(...),我想你需要手动设置popup的大小。

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

    【讨论】:

    • 谢谢!!!几乎一切正常……直到细胞原型线。我设法有一个巨大的弹出窗口,一个巨大的 JList,但 JScrollPane(JList 所在的)仍然是 JComboBox 的宽度。我设置的单元原型(一个 looong JLabel)只影响单元的大小(可能还有 JList;我看到单元要大得多),而不影响 JScrollPane 的宽度(或者是因为 JViewport?)。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多