Получение данных от сканера штрих-кода внутри без текстового поля - PullRequest
10 голосов
/ 18 июля 2011

У меня есть сканер штрих-кода, и в моем java-приложении мне нужно вызвать всплывающее окно для отображения всей информации, связанной со штрих-кодом из базы данных, когда продукт сканируется с использованием штрих-кода.У меня нет текстового поля в приложении, я должен обработать эту часть внутренне.Как мне это сделать ?любое предложение ?Я использую свинг для пользовательского интерфейса.

РЕДАКТИРОВАТЬ

Сканер штрих-кода USB.Если мы сканируем что-либо, результат будет выведен в текстовое поле с фокусом.Но у меня нет текстового поля, работающего на открытой странице.Могу ли я работать со скрытым текстовым полем и прочитать значение там?

Ответы [ 3 ]

7 голосов
/ 06 ноября 2013

Так как не удалось получить ввод через frame.addKeyListener, я использовал этот служебный класс, который использует KeyboardFocusManager:

public class BarcodeReader {

private static final long THRESHOLD = 100;
private static final int MIN_BARCODE_LENGTH = 8;

public interface BarcodeListener {

    void onBarcodeRead(String barcode);
}

private final StringBuffer barcode = new StringBuffer();
private final List<BarcodeListener> listeners = new CopyOnWriteArrayList<BarcodeListener>();
private long lastEventTimeStamp = 0L;

public BarcodeReader() {

    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() != KeyEvent.KEY_RELEASED) {
                return false;
            }

            if (e.getWhen() - lastEventTimeStamp > THRESHOLD) {
                barcode.delete(0, barcode.length());
            }

            lastEventTimeStamp = e.getWhen();

            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                if (barcode.length() >= MIN_BARCODE_LENGTH) {
                    fireBarcode(barcode.toString());
                }
                barcode.delete(0, barcode.length());
            } else {
                barcode.append(e.getKeyChar());
            }
            return false;
        }
    });

}

protected void fireBarcode(String barcode) {
    for (BarcodeListener listener : listeners) {
        listener.onBarcodeRead(barcode);
    }
}

public void addBarcodeListener(BarcodeListener listener) {
    listeners.add(listener);
}

public void removeBarcodeListener(BarcodeListener listener) {
    listeners.remove(listener);
}

}
7 голосов
/ 07 августа 2011

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

final Frame frame = new Frame();
frame.setVisible(true);

frame.addKeyListener(new KeyAdapter() {

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_ENTER) {
            // your code is scanned and you can access it using frame.getBarCode()
            // now clean the bar code so the next one can be read
            frame.setBarCode(new String());
        } else {
            // some character has been read, append it to your "barcode cache"
            frame.setBarCode(frame.getBarCode() + e.getKeyChar());
        }
    }

});
1 голос
/ 15 мая 2014

В некотором роде, похожем на решение @Cyrusmith, я создал решение «проверка концепции» (с некоторыми ограничениями прямо сейчас, но вам предлагается их исправить :)), пытаясь устранить ограничения предыдущих решений в этом посте.:

  • Он поддерживает устройства считывания штрих-кодов, которые не отправляют ENTER в конце строки штрих-кода.
  • Если фокус в настоящее время находится на компоненте свинг-текста, и штрих-код захвачен,штрих-код не попадает в текстовый компонент и только в слушатель штрих-кода.

См. https://stackoverflow.com/a/22084579/320594

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...