这是非常基本的先生,当你与一个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