如果處理鼠標釋放事件,它的工作原理:(該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