【发布时间】:2016-05-17 14:56:06
【问题描述】:
我的 JavaFX 项目中有一个 javafx.scene.control.ChoiceDialog 对象。当对话框打开时,我想将焦点设置到底层ComboBox。但是,我不知道如何获得底层的ComboBox 控件。对于TextInputDialog,有一个称为getEditor() 的方法。有什么方法(除了反射性地访问私有comboBox 成员)来获取底层ComboBox?
【问题讨论】:
-
AFAIK,ComboBox 在 ChoiceDialog 可见时默认接收焦点。
-
在运行 JRE 8u77 x64 的 Windows 7 Enterprise SP1 x64 上,我看到初始焦点在默认按钮(恰好是“确定”按钮)上。我看到
TextInputDialog的行为相同。您是否在其他 OS/JVM 组合上观察到不同的行为? -
我认为这是不可能的。如果你检查 ChoiceDialog 的代码,constructor calls updateGrid() 实习生设置了focus on the ComboBox。
-
requestFocus()的问题在于它只有在舞台显示后才有效。Platform.runLater()简单地“发布 [s] Runnable 到事件队列,然后立即返回 [s] 给调用者”。然后,当主应用程序线程可用并完成处理所有先前排队的任务时,将执行 Runnable。问题是主线程在显示对话框之前可用,因此对requestFocus的调用执行得太早了。因此,该行是一个有效的空操作,焦点仍保留在默认按钮上。 -
来自
Node.requestFocus()的文档:“为了有资格获得焦点,节点必须是场景的一部分,它及其所有祖先都必须可见,并且必须不会被禁用。"