如果您处理鼠标释放事件,它会起作用:(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 具有焦点时,可以使用光标键更改选项卡选择,并且 TextFields 也不会通过基于选择的方法获得焦点。如果您需要,这可能也应该处理。
(最近我遇到了类似的问题。我注意到,当您按下鼠标按钮时,TabPane 会立即切换选项卡。我的猜测是,基于选择的方法请求在鼠标按下后立即关注 TextField,但继续按下鼠标会窃取焦点回到 TabPane。或者甚至可能改变选择的单个鼠标按下事件导致焦点回到 TabPane。但是,我对原因的假设可能不正确,因为我是 JavaFX 的新手。)
编辑:这种处理当然不是最佳的。例如,如果您使用键更改选项卡,doFocus 将被启用,然后单击 TabPane 中的任意位置将触发 requestFocus 调用。我认为应该提到这一点。