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