胶合移动中的JavaFX TextField聚焦属性问题

时间:2018-03-18 18:03:30

标签: javafx gluon-mobile

在将应用程序移植到移动设备(在iOS上)时,我的视图中有一些事情发生。

  1. 当我触摸TextField开始滚动时,文本区域焦点会在滚动期间保持固定在屏幕上。
  2. 我对该字段进行了一些验证,以便当该字段失焦时,会弹出一个指定错误的模态。但是,在iPhone中,文本字段保持聚焦并显示在对话框上。
  3. 请注意,我使用的是JavaFX本机触摸字段,而不是Gluon版本,因为我对于使用TextField的Gluon版本的focusedProperty有问题。它的工作方式是,如果输入无效,它会将字段的值设置为空字符串并打开对话框。

    我尝试了以下方法:

    1. 在View上显示模态,requestFocus之前。
    2. 当scrollpane滚动时,requestFocus在滚动窗格上(scrollpane有自己的自定义皮肤,我可以在滚动时在其上添加requestFocus)。
    3. enter image description here

      enter image description here

1 个答案:

答案 0 :(得分:4)

您遇到的问题将发生在JavaFX TextField和Gluon的问题上,因为后者内部使用内置的JavaFX控件。

在iOS上出现问题的原因是:当JavaFX TextField获得焦点时,在控件之上添加本机iOS UITextField,基本上是为了与本机软件进行交互键盘。

您可以看到TextFieldBehavior在iOS上有specific call

private void handleFocusChange() {
    TextField textField = getControl();

    if (textField.isFocused()) {
        if (PlatformUtil.isIOS()) {
            ...
             textField.getScene().getWindow().impl_getPeer().requestInput(text, type.ordinal(), w, h, 
                    trans.getMxx(), trans.getMxy(), trans.getMxz(), trans.getMxt(),// + insets.getLeft(),
                    trans.getMyx(), trans.getMyy(), trans.getMyz(), trans.getMyt(),// + insets.getTop(),
                    trans.getMzx(), trans.getMzy(), trans.getMzz(), trans.getMzt(), textField.getFont().getSize());
            ...
        }
    }
}

直接转到原生implementation

UITextField* textField = [[UITextField alloc] initWithFrame:CGRectMake(mxt + 1, myt + 1, mxx * (width - 2), myy * (height - 2))];

到目前为止,只要您在原始TextField可见时不滚动并移动JavaFX UITextField初始位置,此方法就可以正常工作。

另请注意,具有本机控件的iOS图层位于JavaFX图层之上(这就是您在对话框顶部看到本机编辑器的原因。)

有一个开放的PR支持在软件键盘出现时更新本机控制位置,翻译JavaFX和iOS控件,并引入可用于的updateBounds method如果滚动事件移动TextField

与此同时,您必须添加一些解决方法,以防止在TextField聚焦时滚动。