マウス リリース イベントを処理すると、次のように動作します (doFocus は、以前にタブ選択が変更された場合にのみ requestFocus 処理を有効にします。それ以外の場合は、TabPane のどこかをクリックするたびに開始されます)。
final SimpleBooleanProperty doFocus = new SimpleBooleanProperty(false);
tabPane.setOnMouseReleased(new EventHandler<Event>() {
@Override
public void handle(Event event) {
if (!doFocus.get()) {
return;
}
doFocus.set(false);
switch (tabPane.selectionModelProperty().getValue().selectedIndexProperty().intValue()) {
case 0: tf1b.requestFocus(); break;
case 1: tf2a.requestFocus(); break;
default: break;
}
}
});
tabPane.selectionModelProperty().getValue().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number oldValue, Number newValue) {
doFocus.set(true);
}
});
TabPane にフォーカスがある場合、カーソル キーを使用してタブの選択を変更できますが、TextField も選択ベースのアプローチではフォーカスを取得しません。必要に応じて、これもおそらく処理する必要があります。
(最近、私は同様の問題を抱えていました。マウス ボタンを押すと、TabPane がすぐにタブを切り替えることに気付きました。私の推測では、選択ベースのアプローチでは、マウスを押した直後に TextField にフォーカスが要求されますが、マウスを押し続けると盗まれます。フォーカスが TabPane に戻る.または、選択を変更する単一のマウス ダウン イベントでさえ、フォーカスが TabPane に戻る.ただし、私は JavaFX の初心者であるため、理由に関する私の仮定は正しくない可能性があります.)
編集: その処理は確かに最適ではありません。たとえば、キーでタブを変更すると、doFocus が有効になり、TabPane 内の任意の場所をクリックすると、requestFocus 呼び出しがトリガーされます。これは言及すべきだと思いました。