【问题标题】:In JavaFx, how to control focus of a custom control?在 JavaFx 中,如何控制自定义控件的焦点?
【发布时间】:2018-01-11 18:03:19
【问题描述】:

假设一个 JavaFX CustomControl 节点包含两个 TextFields。

如果这些TextFields 中的任何一个具有焦点,那么CustomControl.isFocused() 应该返回true。如果它们都没有焦点,那么CustomControl.isFocused() 应该返回false

我该怎么做?

【问题讨论】:

  • @trashgod 那篇文章是关于附加焦点监听器的。那不是我的问题。我有一个由这两个文本字段组成的 CustomControl。考虑一棵树,如果它的任何叶子都聚焦,则该树被认为是聚焦的。
  • 我相信您可以使用委托,如下所示。

标签: javafx focus javafx-8


【解决方案1】:

由于您的CustomControl 使用组合,您可以委派到每个TextField 的焦点属性。给定两个实例,

private final TextField tf1 = new TextField("One");
private final TextField tf2 = new TextField("Two");

实例方法isFocused()的实现很简单:

private boolean isFocused() {
    return tf1.isFocused() | tf2.isFocused();
}

添加焦点监听器如图here查看效果。

tf1.focusedProperty().addListener((Observable o) -> {
    System.out.println(isFocused());
});
tf2.focusedProperty().addListener((Observable o) -> {
    System.out.println(isFocused());
});

这是不可能的。整个问题是isFocused()Node 中是final

您似乎想在CustomControl 中覆盖isFocused(),但这对于final 方法是不可能的,并且它违反了单个组件具有焦点的概念。由于CustomControl 是一个组合,您需要在内部管理焦点。您可能想要使用自定义的FocusModel,如ListView 所示。

【讨论】:

  • 这无法完成。整个问题是isFocused()Node 中是final
  • 啊,你想在CustomControl中覆盖isFocused();以上。
  • 我不确定我是否理解 FocusModel 的概念。我找不到任何关于 FocusModel 是什么以及应该如何使用它的解释。
  • 这只是一种在任意数量的项目中管理焦点的方法;这是ListView implementation; IMO,您的 CustomControl 应返回默认值 false,因为它本身不可聚焦。您希望哪个类使用上面的isFocused()aggregatedFocusPropertyhere 的结果?
  • 我对焦点与 Web 组件一起工作的方式有经验,如果内部元素具有焦点,则包含组件作为一个整体被认为具有焦点。我以为 Javafx 的焦点实现会有相同的原理,但似乎情况并非如此。
【解决方案2】:

尝试一条线解决方案:

public BooleanBinding aggregatedFocusProperty() {
   return Bindings.or(field1.focusedProperty(), field2.focusedProperty());
}

现在在客户端你可以监听这个聚合的焦点属性。

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多