如果用户单击MyExtendedTextField,我将显示一个键盘,代码如下所示。当使用鼠标滚动时,您不会将焦点分散到TextField上,但是当按一下滚动时,焦点就会丢失--当然还有键盘显示器。是否有一种方法可以在touchScroll上获得与mouseScroll上相同的行为?我不想让键盘失去,如果用户是滚动与触摸!
focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue,
final Boolean newValue) {
KeyboardUtils.INSTANCE.setVisible(newValue);
}
});发布于 2015-11-06 13:55:05
这是非常基本的,先生,当您使用触屏滚动时,您肯定会触摸到一个可滚动的Pane区域,以及Pane requestFocus()的触摸,因此您的TextField将失去它的焦点。
因此,要解决这个问题,如果通过使用该窗格或节点的滚动侦听器,或者使用setOnTouchStationary()或setOnTouchReleased()来帮助调整键盘的可见性,而不是躺在TextField的焦点上,就可以将焦点发送回您的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);那你就完了。以上任何一种解决方案都不会造成任何问题。
编辑2
据我所知,TouchEvent是用于支持触摸的计算机的,因此可能与MouseEvent一起使用,您可以检测Pane.setOnMousePressed();等etcc。
希望它能帮上忙
https://stackoverflow.com/questions/33477429
复制相似问题