Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在JCombobox中添加树?_Java_Swing_Tree_Jcombobox - Fatal编程技术网

Java 是否可以在JCombobox中添加树?

Java 是否可以在JCombobox中添加树?,java,swing,tree,jcombobox,Java,Swing,Tree,Jcombobox,因为我的JComboBox中有太多的选项,所以我想根据它们在不同节点中的类型重新组合它们,让用户根据他们喜欢的类型展开或折叠它们是个好主意。这将提高JComboBox的可读性,并为用户节省大量向下或向上滚动查找选项的时间 现在的问题是,是否可以在JComboBox中添加树 最接近我所找到的解决方案的是: 提出替代方案的人建议如下: 如果需要扩展节点,那么更好的选择是添加 出现在侦听项目选择的按钮下方的弹出窗口 在树上。根据具体情况,这样的选择可能会更好 GUI的布局方式 但是,除非我误解了他们的

因为我的JComboBox中有太多的选项,所以我想根据它们在不同节点中的类型重新组合它们,让用户根据他们喜欢的类型展开或折叠它们是个好主意。这将提高JComboBox的可读性,并为用户节省大量向下或向上滚动查找选项的时间

现在的问题是,是否可以在JComboBox中添加树

最接近我所找到的解决方案的是:

提出替代方案的人建议如下:

如果需要扩展节点,那么更好的选择是添加 出现在侦听项目选择的按钮下方的弹出窗口 在树上。根据具体情况,这样的选择可能会更好 GUI的布局方式


但是,除非我误解了他们的意思,否则他们不会在JComboBox中添加树,这正是我想要的。

是的,您可以用
JTree
替换弹出组件中的
JList
。但是您还需要提供
ComboBoxModel
TreeModel
之间的通信(当在
JTree
中选择一个项目时,它也将在
JComboxModel
中选择,反之亦然)。例如,您可以构建
ComboBoxModel
的实现,该实现将
TreeModel
作为代理,并在
TreeModel
每次更改时(触发
treemodelent
)提供树的线性化,以获取combobox的项目列表。您还需要为树中的鼠标/按键事件提供反应,以更新组合框中的选择

您可以使用以下方法将任何组件设置为
JComboBox
的弹出窗口(在您的情况下,它应该是一个包装
JTree
JScrollPane
):

/**
*将自定义组件设置为组合框的弹出组件。
*
*@param组合框可获得新的弹出组件。
*@param comp新弹出组件。
*@param widthIncr弹出窗口的宽度增量。
*@param heightIncr弹出窗口的高度增量。
*/
公共静态void setPopupComponent(JComboBox组合、组件组合、整数宽度增量、整数高度增量){
最终ComboPopup=(ComboPopup)combo.getUI().getAccessibleChild(combo,0);
if(容器的弹出实例){
最终容器c=(容器)弹出窗口;
c、 removeAll();
c、 setLayout(新的GridLayout(1,1));
c、 添加(comp);
最终尺寸=组件getPreferredSize();
尺寸.宽度+=宽度增量;
尺寸.高度+=高度增量;
c、 设置首选大小(大小);
}
}

参数
widthIncr
heightIncr
可以用于一些外观和感觉,以便更好地采用组合框中弹出窗口的默认宽度/高度。

感谢您的回答。如果您不介意的话,请回答最后一个问题,除非我没有完全理解,否则使用
setPopupComponent
会将JTree组件及其节点添加到JComboBox中,对吗?@JesseJames此方法会从弹出组件中删除标准列表,并将您转移到该方法中的任何组件添加到弹出组件中。它可以是
JTree
JTable
或任何自定义组件(例如,包含表格和筛选字段的面板)。如果您只需要一个树,请使用:
setPopupComponent(myCombo,新的JScrollPane(myTree),0,0)
。其中,
myCombo
是您的组合框,
myTree
是您的树。
/**
 * Sets the custom component as popup component for the combo-box.
 *
 * @param combo combo-box to get new popup component.
 * @param comp new popup component.
 * @param widthIncr width increment for pop-up.
 * @param heightIncr height increment for pop-up.
 */
public static void setPopupComponent(JComboBox<?> combo, Component comp, int widthIncr, int heightIncr) {
    final ComboPopup popup = (ComboPopup) combo.getUI().getAccessibleChild(combo, 0);
    if (popup instanceof Container) {
        final Container c = (Container) popup;
        c.removeAll();
        c.setLayout(new GridLayout(1, 1));
        c.add(comp);
        final Dimension size = comp.getPreferredSize();
        size.width += widthIncr;
        size.height += heightIncr;
        c.setPreferredSize(size);
    }
}