Glion Mobile中以JavaFX TextField为中心的属性问题

Glion Mobile中以JavaFX TextField为中心的属性问题,javafx,gluon-mobile,Javafx,Gluon Mobile,在我看来,将应用程序移植到移动设备(iOS)时,有几件事情正在进行 当我通过触摸文本字段开始滚动时,文本字段的焦点会在滚动期间固定在屏幕上 我对字段进行了一些验证,这样当字段失去焦点时,会弹出一个模式来指定错误。然而,在iPhone中,文本字段保持焦点并显示在对话框上 请注意,我使用的是JavaFX原生触摸字段,而不是glion版本,因为我对TextField的glon版本的focusedProperty有问题。它的工作方式是,如果输入无效,它会将字段的值设置为空字符串并打开对话框 我尝试了以下

在我看来,将应用程序移植到移动设备(iOS)时,有几件事情正在进行

  • 当我通过触摸文本字段开始滚动时,文本字段的焦点会在滚动期间固定在屏幕上
  • 我对字段进行了一些验证,这样当字段失去焦点时,会弹出一个模式来指定错误。然而,在iPhone中,文本字段保持焦点并显示在对话框上
  • 请注意,我使用的是JavaFX原生触摸字段,而不是glion版本,因为我对TextField的glon版本的focusedProperty有问题。它的工作方式是,如果输入无效,它会将字段的值设置为空字符串并打开对话框

    我尝试了以下方法:

  • 在显示模式之前,请先关注视图
  • 滚动窗格滚动时,请在滚动窗格上显示requestFocus(滚动窗格有自己的自定义外观,我可以在滚动时在其上添加requestFocus)

  • 您所面临的问题将发生在JavaFX
    TextField
    和glion's上,因为后者在内部使用内置的JavaFX控件

    iOS上出现问题的原因是:当JavaFX
    TextField
    获得焦点时,会在控件顶部添加一个本机iOS
    UITextField
    ,基本上是为了启用与本机软件键盘的交互

    您可以看到
    textfieldphavior
    在iOS上有一个:

    这直接涉及到本地人:

    到目前为止,只要在本地
    UITextField
    可见时不滚动和移动JavaFX
    TextField
    初始位置,就可以正常工作

    还要注意,带有本机控件的iOS层位于JavaFX层的顶部(这就是为什么您一直看到对话框顶部的本机编辑器)

    有一个开放的PR,支持在出现软件键盘时更新本机控件位置,转换JavaFX和iOS控件,并引入
    updateBounds
    ,可在滚动事件移动
    文本字段时使用


    同时,您必须添加一些解决方法,以防止在
    文本字段
    处于焦点时滚动。

    您知道如何处理该对话框问题吗?在弹出打开对话框之前,我曾尝试向另一个控件请求焦点,但这不起作用。
    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());
                ...
            }
        }
    }
    
    UITextField* textField = [[UITextField alloc] initWithFrame:CGRectMake(mxt + 1, myt + 1, mxx * (width - 2), myy * (height - 2))];