Некоторые догадки после прочтения немного:
FNC1 не имеет стандартного представления.
В этом ответе стекопотока предполагается, что нет способа напрямую кодировать FNC1 в кодировке по умолчанию Latin-1, используемой для передачи.
В качестве обходного пути большинство читателей, по-видимому, по умолчанию используют управляющий символ ASCII «Разделитель групп» (GS, 29, 0x1d).
Вы используете поворотный регулятор для отображения и работы с данными.
Swing в первую очередь предназначен для отображения, а не для правильной обработки данных.
Я предполагаю, что случается так, что свинг лишает непечатного символа GS, когда он установлен в содержимом JTextArea
Учитывая, что вы не очень четко представляете, как именно ваш сканер передает данные, но вы упоминаете «Это больше похоже на клавиатуру», я предполагаю, что сканер передает данные, притворяясь клавиатурой.
Вы выбираете вход, нажимая кнопку на сканере, и он отправляет данные в виде нажатий клавиш.
Теперь, если это так, вы не сможете использовать Swing DocumentListener/Document
для решения этой проблемы.
Следующий вопрос переполнения стека в основном относится к той же проблеме, что и у вас (с той разницей, что они используют qrcode вместо штрих-кода): ASCII Непечатаемые символы в текстовом компоненте
Теперь вопрос, который я связал, предполагает, что вы можете использовать KeyBinding
или KeyListener, чтобы это исправить. Обратите внимание, что будет каким-то образом нарушать шестнадцатеричное представление, если вы хотите напечатать непечатаемый символ.
UTF-8 имеет специальную кодовую точку для ASCII непечатных представлений символов.
«Символ для группового разделителя» расположен по адресу \u241d
. Вариант для обработки этого будет тогда:
jtf1.getInputMap().put(KeyStroke.getKeyStroke(29), "handleGS");
jtf1.getActionMap().put("handleGS", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
jtf1.setText(jtf1.getText() + "\u241d");
}
}
Таким образом, шестнадцатеричное представление должно стать:
.. , 33, 34, e2, 90, 9d, 32, 31, 31, 30]
Обратите внимание, что, поскольку мы переназначили GS на Unicode "SYMBOL_FOR_GS", мы получаем e2, 90, 9d
вместо 1d
.