2017-08-03 27 views
1

たとえば、2つのTextFieldを含むJavaFX CustomControlノードがあるとします。JavaFxでは、カスタムコントロールのフォーカスを制御する方法は?

TextFieldのいずれかにフォーカスがある場合、CustomControl.isFocused()trueを返す必要があります。どれもフォーカスがない場合、CustomControl.isFocused()falseを返します。

どうすればよいですか? CustomControl構図を使用して、あなたのよう

+0

[* FocusListener for JavaFX Nodes *](https://stackoverflow.com/q/21798183/230513)を参照してください。 – trashgod

+0

@trashgodこの投稿はフォーカスリスナーをつけることについてです。それは私の問題ではない。私はこれらの2つのテキストフィールドによって作成されるCustomControlを持っています。その葉のいずれかに焦点が当てられている場合、焦点が合っていると考えられる樹木について考えてみてください。 – MarcG

+0

下記のように、委任を使用できると思います。 – trashgod

答えて

1

、することができます各TextFieldのフォーカスプロパティへデリゲート。 2つのインスタンス、インスタンスメソッドisFocused()

private final TextField tf1 = new TextField("One"); 
private final TextField tf2 = new TextField("Two"); 

実装を考えることは、次に簡単である:効果を確認するためにhereを示すよう

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()がで、Nodeであることです。

あなたがCustomControlisFocused()を上書きしたかったようだが、それはfinal方法は不可能であり、それがフォーカスを有する単一コンポーネントの概念に反します。 CustomControlはコンポジットなので、内部的にフォーカスを管理する必要があります。 ListViewに示すように、カスタムFocusModelを使用することができます。あなたはこの集約フォーカスプロパティを聴取することができるクライアント側で今

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

+0

これはできません。全体の問題は 'isFocused()'が 'Node'の' final'です。 – MarcG

+0

ああ、 'CustomControl'の' isFocused() 'をオーバーライドしたいと思っています。上記より。 – trashgod

+0

私はFocusModelのコンセプトを理解していません。私はFocusModelが何であるか、どのように使用されるべきかの説明を見つけることができませんでした。 – MarcG

1

は、1行のソリューションをお試しください。

+0

これは私が今行っていることですが、間違っていると感じます。 – MarcG

関連する問題