有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想制作一个多列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) 个答案

  1. # 1 楼答案

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