Как перехватить * все * символы, отправленные в текстовое поле со сканера штрих-кода HID? - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно захватить ввод со сканера штрих-кода.До этого момента ввод был простым буквенным текстом, который я записал в одном текстовом поле.Я добавил ModifyListener в текстовое поле и могу видеть поступление ввода.Это сработало нормально.

Теперь мне нужно обработать более сложный матричный код, который содержит значения для нескольких полей.Значения разделены непечатаемыми символами, такими как RS, GS и EOT (0x1E, 0x1D, 0x04).Полный поток данных имеет четко определенный заголовок и EOT в конце, поэтому я надеюсь, что смогу обнаружить ввод штрих-кода, а не ручной ввод.

При обнаружении штрих-кода я могу использоватьразделители записей RS для разделения сообщения и вставки значений в соответствующие текстовые поля.

Однако стандартный обработчик ключа в элементах управления Text игнорирует эти непечатаемые символы и не отображается в элементах управления.текст.Это делает невозможным выполнение запланированных действий.

Как я могу изменить эти текстовые поля, чтобы принимать и хранить все символы?Или я мог бы использовать альтернативный подход?

1 Ответ

0 голосов
/ 25 сентября 2019

Это код, который я использовал для обработки потока штрих-кода.

public class Main
{
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args)
    {
        Display d = new Display();
        Shell shell = new Shell(d);

        shell.setLayout(new FillLayout());

        Text text = new Text(shell, 0);

        text.addListener(SWT.KeyDown, new Listener()
        {
            @Override
            public void handleEvent(Event e)
            {
                // only accept real characters
                if (e.character != 0 && e.keyCode < 0x1000000)
                {
                    sb.append(e.character);

                    String s = sb.toString();
                    // have start and end idents in buffer?
                    int i = s.indexOf("[)>");
                    if (i > -1)
                    {
                        int eot = s.indexOf("\u0004", i);
                        if (eot > -1)
                        {
                            String message = s.substring(i, eot + 1);
                            handleMessageHere(message);

                            // get ready for next message
                            sb = new StringBuilder();
                        }
                    }
                }
            }
        });

        shell.open();
        while (!shell.isDisposed())
        {
            if (!d.readAndDispatch())
                d.sleep();
        }
    }
...