如果处理鼠标释放事件,它的工作原理:(该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调用。我认为这应该被提及。
是否包裹[requestFocus的](http://docs.oracle.com/ javafx/2/api/javafx/scene/Node.html#requestFocus%28%29)在[Platform.runLater](http://docs.oracle.com/javafx/2/api/javafx/application/Platform。 html#runLater%28java.lang.Runnable%29)解决你的问题? – jewelsea 2013-03-26 21:26:46
我为此打开了一个问题(https://javafx-jira.kenai.com/browse/RT-35765),您可以观看并投票。 – 2014-02-10 14:37:03