[英]How to only change color of the last character in a javafx TextField
[英]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);
我認為問題是您想通過鍵盤輸入並在文本字段中看到控制字符:
所以我得出以下解決方案:
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.