簡體   English   中英

如何從JAVAFx中的TextField接受SOH字符

[英]How to accept SOH character from TextField in JAVAFx

我編寫了一個簡單的GUI屏幕,其中實際上包含一個JavaFx textField,用戶在其中輸入一個字符串,而該String我必須傳遞給TCP客戶端。

現在的問題是用戶輸入一個包含SOH作為定界符的字符串。 SOH就是“ \\ u001”。 但是,當用戶輸入包含此定界符的String時,它將被刪除,並且僅檢索簡單的純文本。 我該如何消除。 這個獨特的角色對我來說非常重要。 例如,我的字符串如下:

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

觀察上面的字符串,其中有\\ u001字符表示SOH。 但是,當我在TextField中輸入此String時,結果如下:

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應該起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM