创建带有自定义弹出窗口的JavaFX组合框

创建带有自定义弹出窗口的JavaFX组合框,javafx,combobox,popup,Javafx,Combobox,Popup,我想编写一个组合框,在其弹出窗口(而不是公共ListView)中包含一个自定义节点对象。ColorPicker和DatePicker是很好的例子,它们是ComboBoxBase的另外两个实现。我原以为我也可以轻松地扩展ComboBoxBase,但由于没有PopuProperty或popupFactory,我不知道如何设置内容。除此之外,它还意味着什么?或者ColorPicker和DatePicker是如何做到这一点的?ComboBoxPopupControl扩展了ComboBoxBaseSkin

我想编写一个组合框,在其弹出窗口(而不是公共ListView)中包含一个自定义节点对象。ColorPicker和DatePicker是很好的例子,它们是ComboBoxBase的另外两个实现。我原以为我也可以轻松地扩展ComboBoxBase,但由于没有PopuProperty或popupFactory,我不知道如何设置内容。除此之外,它还意味着什么?或者ColorPicker和DatePicker是如何做到这一点的?

ComboBoxPopupControl
扩展了
ComboBoxBaseSkin
包含
getPopupContent()
。这就是你正在寻找的方法。在您自己的皮肤实现中,它扩展了ComboBoxSkins之一,您可以返回您喜欢的弹出式内容(尽管不建议使用私有API)

公共类CustomComboBox扩展ComboBox{
@凌驾
受保护的皮肤createDefaultSkin(){
返回新的CustomComboxSkin(此);
}
}
公共类CustomComboBoxSkin扩展了ComboBoxPopupControl{
公共CustomComboxSkin(ComboBox ComboBox){
超级(组合框,新的CustomComboboxBehavior(组合框));
}
@凌驾
公共节点getPopupContent(){
返回新矩形(150200);
}
//继承的方法。。。
}

ComboBoxPopupControl
扩展了
ComboBoxBaseSkin
包含
getPopupContent()
。这就是你正在寻找的方法。在您自己的皮肤实现中,它扩展了ComboBoxSkins之一,您可以返回您喜欢的弹出式内容(尽管不建议使用私有API)

公共类CustomComboBox扩展ComboBox{
@凌驾
受保护的皮肤createDefaultSkin(){
返回新的CustomComboxSkin(此);
}
}
公共类CustomComboBoxSkin扩展了ComboBoxPopupControl{
公共CustomComboxSkin(ComboBox ComboBox){
超级(组合框,新的CustomComboboxBehavior(组合框));
}
@凌驾
公共节点getPopupContent(){
返回新矩形(150200);
}
//继承的方法。。。
}

我使用
ComtextMenu
替换通讯盒的弹出窗口,如下所示:

ContextMenu menu = new ContextMenu();
MenuItem item = new MenuItem();
item.setGraphic(new Lable("test"));
menu.getItems.add(item);
commbox.setContextMenu(null);
commbox.setContextMenu(menu ); 
commbox.getContextMenu().show(comboBox, Side.BOTTOM, 0, 0);

它工作正常。

我使用
ComtextMenu
替换通讯盒的弹出窗口,如下所示:

ContextMenu menu = new ContextMenu();
MenuItem item = new MenuItem();
item.setGraphic(new Lable("test"));
menu.getItems.add(item);
commbox.setContextMenu(null);
commbox.setContextMenu(menu ); 
commbox.getContextMenu().show(comboBox, Side.BOTTOM, 0, 0);

它工作正常。

看看
com.sun.javafx.scene.control.skin.ComboBoxListViewSkin
+超类。这些是负责弹出窗口外观的类。。。(在
节点的源代码中查找
createDefaultSkin
,以查找所使用的皮肤)为了防止人们仍然遇到同样的问题,这里有一个带有工作代码片段的线程:查看
com.sun.javafx.scene.control.skin.ComboBoxListViewSkin
+超类。这些是负责弹出窗口外观的类。。。(在
节点
的源代码中查找
createDefaultSkin
,以查找使用的皮肤)为了防止人们仍然遇到相同的问题,这里有一个线程,其中有一个工作代码片段:我明白了。但你为什么说“不推荐”?我的意思是,我还应该如何将ListView与TableView、TreeView或其他完全不同的东西交换?不建议使用私有API,因为它的类可能会在将来的版本中更改,这反过来会阻止您的代码。如果你想扩展组合框,我想没有其他选择了。但是,如果您不需要listview行为,也许可以选择使用Java9皮肤api构建您自己的自定义控件。所以现在扩展ComboBoxPopupControl是一个很好的有效的可能性。但你为什么说“不推荐”?我的意思是,我还应该如何将ListView与TableView、TreeView或其他完全不同的东西交换?不建议使用私有API,因为它的类可能会在将来的版本中更改,这反过来会阻止您的代码。如果你想扩展组合框,我想没有其他选择了。但是,如果您不需要listview行为,也许可以选择使用Java9皮肤api构建您自己的自定义控件。因此,现在扩展ComboBoxPopupControl是一种很好且有效的可能性。它没有效果。显示空的公共组合框弹出窗口,并且根本没有上下文菜单。忘记了什么?您需要一个操作来调用代码,比如
text.setonkeyreased(e->{//add contextmenu here})
。我尝试了您的代码(在更正了所有错误后)。它没有效果。显示空的公共组合框弹出窗口,并且根本没有上下文菜单。忘记了什么?您需要一个操作来调用代码,比如
text.setonkeyreased(e->{//add contextmenu here})