如何在JavaFX8中禁用combobox弹出窗口的隐藏?

有没有办法不断显示combobox弹出窗口? 问题是关于datepicker,但它是combobox的后代。 我想调用combobox的show()方法然后不断显示它直到阶段关闭。 到目前为止最好的事情是

showingProperty().addListener({ ov, old, newValue -> if (!newValue) this.show() }) 

它有点工作,但它隐藏弹出窗口然后显示它,这是不方便的。

糟糕的解决方案

将弹出内容从日期选取器外观中取出,并像任何其他节点一样使用它。 请注意,日期选择器本身必须至少一次呈现为场景的一部分,以便初始化外观。 可能有一种更聪明的方法来初始化皮肤。

 final DatePicker datePicker = new DatePicker(); final StackPane root = new StackPane( datePicker ); final Scene scene = new Scene( root, 250, 200 ); primaryStage.setScene( scene ); primaryStage.show(); datePicker.setVisible( false ); datePicker.setManaged( false ); final com.sun.javafx.scene.control.skin.DatePickerSkin skin = (com.sun.javafx.scene.control.skin.DatePickerSkin) datePicker.getSkin(); root.getChildren().add( skin.getPopupContent() ); 

github上的完整示例代码 。

好的解决方案

使用专门为您的目的而制作的控件,例如JFXtras的CalendarPicker 。

在此处输入图像描述

http://jfxtras.org/

如果您可以覆盖ComboBoxBase方法的hide()方法,则可以阻止控件关闭。 您必须创建一个新类,如alwaysOpenDatePicker,并让它扩展javafx场景数据贴图类。 在该类中,您可以覆盖hide()方法,在该方法中您将不执行任何操作。

我不确定这是否有效,我只是在大声思考。 我想这值得一试,让我知道它是否有效:)。

以及指向ComboBoxBase页面的链接: https : //docs.oracle.com/javafx/2/api/javafx/scene/control/ComboBoxBase.html