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