【问题标题】:JAVA FX ScrollPane Does Not Allow To Request Focus On A FieldJAVA FX ScrollPane 不允许请求关注某个字段
【发布时间】:2014-10-08 16:09:56
【问题描述】:

我正在开发一个 JavaFX 客户端。它是一个两窗格的软件。左窗格是一个列表,显示了为客户端开发的几个应用程序(具有不同的布局)(Application_1Application_2 等)。右侧窗格是显示Application_N 的位置。

显示在软件右窗格中的应用程序具有以下 java 类层次结构:

BorderPane -> Application(我开发的应用类)。

Application 类有一个 Node 属性 (Node body;) 包含一个表单,而这个表单包含一个 Field

当应用程序在上面提到的右窗格中显示时它调用方法requestFocus(),并且该方法(从JavaFX Node类覆盖)有责任请求焦点(这次使用原始@来自 JavaFX Node 类的 987654334@ 方法)用于上述字段。

这个程序效果很好。但是,问题是当我想添加一个包含Node 正文的ScrollPane 时。似乎是ScrollPane 不允许将请求焦点方法应用于正文中的字段。

下面写的代码来自Application.java

  Node body;

  body = getBody(); // getBody() builds the UI of this application

  scrollPanel = new ScrollPane();
  scrollPanel.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
  scrollPanel.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
  scrollPanel.setFitToWidth(true);
  scrollPanel.setFitToHeight(true);
  scrollPanel.getStyleClass().add("application");
  scrollPanel.setContent(body);

  this.setCenter(scrollPanel);

  ...

现在,当要显示应用程序时,它会执行以下代码:

   public void create(){
       requestFocus();  
   }

   @Override
   public void requestFocus(){
    accountField.requestFocus(); //using the method from the JavaFX node class
}

我重申问题正在发生当我将滚动窗格放入我的层次结构时。如果有人对此有评论或解决方案,我将不胜感激。谢谢。

【问题讨论】:

  • 如果您将 requestFocus 调用包装在 Platform.runLater() 中或者使用此 task hack for delayed focus control 是否有效?
  • 我已经尝试过该解决方案。在 Platform.runLater() 中包装 requestFocus 方法。然而,它只在某些时候有效。我不知道为什么。它可能与 Java FX 线程有关,但完全不确定。 @jewelsea
  • 我将尝试您提供的第二个选项。谢谢。 @jewelsea
  • That task hack using Thread.sleep() 不是我的首选选项,因为它并不完全准确。你必须玩弄时间。但是,它可以工作,我会在继续研究滚动窗格(因为没有它,请求焦点在我的特定子节点上)和 Java FX 线程之间的关系时,我会接受它。谢谢。 @jewelsea

标签: java javafx focus setfocus focusable


【解决方案1】:

我发现 scrollPane 不完整且有问题。 在这个阶段,我的解决方案是复制 openjfx ScrollPane[Behavior|Skin] 源并进行必要的修改。

完成后,您可以在 ScrollPaneBehavior 中更改焦点窃取行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2021-09-03
    • 2017-03-15
    • 2013-11-22
    • 2014-11-05
    相关资源
    最近更新 更多