假设一个 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()
final
Node
.
似乎您想在CustomControl
中覆盖isFocused()
,但这对于final
方法是不可能的,并且会违反单个组件具有焦点的概念。由于CustomControl
是一个复合体,您需要在内部管理焦点。您可能希望使用自定义FocusModel
如ListView
所示。
尝试单行解决方案:
public BooleanBinding aggregatedFocusProperty() {
return Bindings.or(field1.focusedProperty(), field2.focusedProperty());
}
现在,在客户端上,您可以侦听此聚合焦点属性。