這是非常基本的先生,當你與一個Touchscroll滾動你肯定輕觸滾動Pane
區域以及Pane
requestFocus()
通過觸摸,所以你TextField
將失去它的焦點。
所以要解決它,你送焦點回到你的TextField
如果您發現觸摸或者通過使用窗格或節點的滾動監聽器或去setOnTouchStationary()
或setOnTouchReleased()
,以幫助調整鍵盤的可見性,而不是躺在重點是你的TextField
。
編輯
試試這個
Node lastFocusedNode =null; // lastly known node to have focus
//now every node or child in your ScrollPane or Scrollable parent
//that you care about will have a focusable listener-including
// your textfield
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(
ObservableValue<? extends Boolean> observable,
Boolean oldValue, Boolean newValue) {
if(!newValue){//if they loose focus
lastFocusedNode = textField;
//if they loose focus attach them to lastFocusedNode
}
}
});
//the above saves you iterations
那麼當你的ScrollPane /滾動節點接收集中您將它們設置爲lastFocusedNode
,因爲它只是將允許滾動。上述
sp.focusedProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
if (lastFocusedNode != null) {
lastFocusedNode.requestFocus();
}
}
});
假設你的ScrollPane將只是沒有做任何事情,從滾動消耗一邊..
,如果你的ScrollPane /滾動父母不與這樣的假設會那麼 你去使用這種方法,檢測時用戶在觸摸您的可滾動節點的內容區域後滾動 - 僅當用戶在觸摸後嘗試滾動時纔有效。
//approach loaded
final InvalidationListener lis = new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
//here it is changing
if(sp.isFocused())
lastFocusedNode.requestFocus();//take the focus away
}
};
使用您設置的hvalueProperty()和vvalueProperty()或您的ScrollPane上述無效聽衆 - 其滾動父您使用的?
sp.hvalueProperty().addListener(lis);
sp.vvalueProperty().addListener(lis);
,那麼你就完成了。上述任何解決方案都會引起沒有problemo
EDIT 2
據我所知TouchEvent
是觸控功能的電腦,所以也許有MouseEvent
去,你可以檢測Pane.setOnMousePressed();
等ETCC
希望它幫助
感謝您的答案,所以對於每個TouchEvent我需要遍歷該窗格的所有子節點以獲取被聚焦的節點? (這是可能的,因爲TouchEvent請求焦點?然後在發佈我requestFocus然後呢?但是,這不是真的不行嗎? – Tobi
你會評論嗎? – Tobi
讓我知道,如果它的好先生@Tobi – Elltz