2017-08-03 91 views
1

假設一個JavaFX CustomControl節點包含例如兩個TextField s。在JavaFx中,如何控制自定義控件的焦點?

如果其中任何一個TextField有焦點,那麼CustomControl.isFocused()應返回true。如果他們都沒有焦點,那麼CustomControl.isFocused()應該返回false

我該怎麼做?

+0

請參閱[* JavaFX節點*的焦點偵聽器](https://stackoverflow.com/q/21798183/230513)。 – trashgod

+0

@trashgod該帖子是關於附加焦點聽衆。這不是我的問題。我有一個由這兩個文本字段組成的CustomControl。想想一棵樹,如果它的任何一片葉子都聚焦,那麼這棵樹將被認爲是聚焦的。 – MarcG

+0

我相信你可以使用代表團,如下所示。 – trashgod

回答

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

看來你想在CustomControl覆蓋isFocused(),但是這是不可能的final方法,它會破壞具有聚焦單一成分的概念。由於CustomControl是一個組合,您需要在內部管理焦點。您可能想要使用FocusModel,如ListView所示。

+0

這不能完成。整個問題是'節點'中的isFocused()是'final'。 – MarcG

+0

啊,你想在'CustomControl'中重寫'isFocused()';更上面。 – trashgod

+0

我不確定我是否理解FocusModel的概念。我無法找到關於FocusModel是什麼以及它應該如何使用的任何解釋。 – MarcG

1

嘗試一個在線解決方案:

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

現在在客戶端可能會聽此聚集的焦點屬性。

+0

這是我到目前爲止所做的,但感覺不對。 – MarcG