【问题标题】:JavaFX Get ComboBox from ChoiceDialogJavaFX 从 ChoiceDialog 获取 ComboBox
【发布时间】: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() 的文档:“为了有资格获得焦点,节点必须是场景的一部分,它及其所有祖先都必须可见,并且必须不会被禁用。"

标签: java javafx javafx-8


【解决方案1】:

要将焦点设置到ComboBox,您可以使用肮脏的hack,它会在显示后触发ChoiceDialogupdateGrid

ChoiceDialog<String> choiceDialog = new ChoiceDialog<>("test", getData());
choiceDialog.showingProperty().addListener((ov, b, b1) -> {
    if (b1) {
        choiceDialog.setContentText("");
    }else {
        choiceDialog.setContentText(null);
    }

    //or 
    if (b1) {
        Node comboBox = choiceDialog.getDialogPane().lookup(".combo-box");
        comboBox.requestFocus();
    }
});

使用样式类获取ComboBox 实例对于覆盖默认键盘导航很有用:

final var options = (ComboBox) getDialogPane().lookup( ".combo-box" );
options.setOnKeyPressed( ( event ) -> {
  // When the user presses the down arrow, open the drop-down. This prevents
  // navigating to the cancel button.
  if( event.getCode() == KeyCode.DOWN && !options.isShowing() ) {
    options.show();
    event.consume();
  }
} );

当上述更改到位时,按下向下箭头键将打开组合框实例,而不是导航到“取消”按钮。

【讨论】:

  • 您是如何计算出“.combo-box”常量的?我想知道,这样我以后可以自己查一下。
  • 这是ComboBox 的默认样式类。您可以从CSS Reference Guide 获取Node 的样式类,也可以使用Scenicview 检查Scenegraph 的属性
  • Jeff,还要查看 modena.css,它位于您的 JRE 目录中的 jfxrt.jar 内。 modena 样式表定义了所有控件的默认样式。如果您正在自定义现有控件的样式、根据其结构进行 CSS 查找或只是想了解 JavaFX CSS 定义的最佳实践,modena.css 是一个非常宝贵的资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 2015-06-14
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多