假設一個JavaFX CustomControl
節點包含例如兩個TextField
s。在JavaFx中,如何控制自定義控件的焦點?
如果其中任何一個TextField
有焦點,那麼CustomControl.isFocused()
應返回true
。如果他們都沒有焦點,那麼CustomControl.isFocused()
應該返回false
。
我該怎麼做?
假設一個JavaFX CustomControl
節點包含例如兩個TextField
s。在JavaFx中,如何控制自定義控件的焦點?
如果其中任何一個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();
}
添加焦點偵聽如圖here看到效果。
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());
}
現在在客戶端可能會聽此聚集的焦點屬性。
這是我到目前爲止所做的,但感覺不對。 – MarcG
請參閱[* JavaFX節點*的焦點偵聽器](https://stackoverflow.com/q/21798183/230513)。 – trashgod
@trashgod該帖子是關於附加焦點聽衆。這不是我的問題。我有一個由這兩個文本字段組成的CustomControl。想想一棵樹,如果它的任何一片葉子都聚焦,那麼這棵樹將被認爲是聚焦的。 – MarcG
我相信你可以使用代表團,如下所示。 – trashgod