在JavaFx中,如何控制自定义控件的焦点?

时间:2017-08-03 23:13:53

标签: javafx focus javafx-8

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

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

我该怎么做?

2 个答案:

答案 0 :(得分: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()finalNode

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

答案 1 :(得分:1)

尝试一线解决方案:

custEvents.GroupBy(c => c.Customer)
          .Where(g => g.Any(c => c.wk1eventId != null || c.wk2eventId != null || c.wk3eventId != null || c.wk4eventId != null))
          .SelectMany(g => g);  

现在,在客户端,您可以收听此聚合焦点属性。