如何在JAVAFx

时间:2017-12-04 10:43:32

标签: java javafx

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

现在问题是用户输入一个包含SOH作为分隔符的字符串。 SOH只不过是“\ u001”。但是当用户输入包含此分隔符的String时,它将被删除,并且只检索简单的纯文本。我怎么能消除这个。这个独特的角色对我来说非常重要。 例如,我的字符串如下:

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

观察上面的String,其中我有代表SOH的\ u001字符。但是当我在TextField中输入这个String时,结果如下:

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

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

3 个答案:

答案 0 :(得分:4)

问题是javaFX TextField使用以下function过滤了无效字符:

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);

答案 1 :(得分: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粘贴文本。

答案 2 :(得分:-1)

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

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

我认为UTF-8应该有用。