如何接受Javafx中Textfield的SOH角色



我写了简单的GUI屏幕,该屏幕实际上包含一个Javafx Textfield,用户输入字符串,我必须将其传递给TCP客户端。

现在,问题是用户输入包含SOH作为定界线的字符串。SOH不过是" u001"。但是,当用户输入包含此定界符的字符串时,将其删除,并且仅检索简单的纯文本。我如何消除这一点。这个独特的角色对我来说非常重要。例如,我的字符串如下:

8=FIX.4.2u001 9=9 u001 35=A u001 34=1u001 49=TTDS68AP

观察者上面的字符串,其中我具有代表soh的 u001字符。但是当我在文本字段中输入此字符串时,结果就像:

8=FIX.4.29=9135=A34=149=TTDS68AP

如何也从文本字段中获得SOH字符?

问题是javafx TextField过滤了无效的字符,具有以下功能:

private static boolean isInvalidCharacter(char c, boolean newlineIllegal, boolean tabIllegal) {
    if (c == 0x7F) return true;
    if (c == 0xA) return newlineIllegal;
    if (c == 0x9) return tabIllegal;
    if (c < 0x20) return true;
    return false;
}

这是在粘贴和将字符串存储在字段中之前发生的。在称为"自定义过滤器"的功能之前,在此滤镜中,您可以将SOH更改为其他东西。它是Unicode表示␁是一个很好的候选人:

textField.setTextFormatter(new TextFormatter<>((t) -> {
    t.setText(t.getText().replace((char)1, 'u2401'));
    return t;
}));

添加上述内容将在粘贴和存储之前将其更改。当您想从TextField使用String时,您需要使用以下方式将其替换为SOH

String withSOH = field.getText().replace('u2401', (char)1);

我认为问题是您要通过键盘输入并在文本字段中查看控制字符:

  • ctrl-a(soh)是已知的快捷方式,并且选择了先前的字符。
  • 控制字符将不会以普通字体显示。

所以我来了以下解决方案:

    String SOH_REPR = "°"; // We show SOH as this string.
    someTextField.setOnKeyPressed((ke) -> {
                if (ke.getCode().getName().equals("A")
                        && ke.isControlDown()
                        && !ke.isAltDown()
                        && !ke.isMetaDown()
                        && !ke.isShiftDown()) {
                    TextField textField = (TextField) ke.getSource();
                    ke.consume();
                    int pos = textField.getCaretPosition();
                    textField.insertText(pos, SOH_REPR);
                }
            });
    someTextField.setOnKeyReleased((ke) -> {
                if (ke.getCode().getName().equals("A")
                        && ke.isControlDown()
                        && !ke.isAltDown()
                        && !ke.isMetaDown()
                        && !ke.isShiftDown()) {
                    ke.consume();
                }
            });
// Convert it back.
String text = someTextField.getText().replace(SOH_REPR, "u0001");

仍然需要用SOH粘贴文本以解决完整性。

尝试将您的编码添加为参数。

System.setProperty("file.encoding", "yourEncoding");

我认为UTF-8应该起作用。

最新更新