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



假设一个 JavaFXCustomControl节点包含两个TextField

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

我该怎么做?

由于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();
}

添加焦点侦听器,如下所示以查看效果。

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

这是做不到的。整个问题是isFocused()finalNode.

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

尝试单行解决方案:

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

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

最新更新