2013-07-01 2 views
2

Я нашел хороший Q/A здесь, на моей проблеме, но не смог найти правильный.Java swt KeyListener «решение» штрих-код чтения

У меня есть barcode reader, который считывает штрих-код и отправляет отсканированный код в качестве ввода с клавиатуры. Это нормально, я могу поймать вход легко

browser.addKeyListener(new KeyAdapter() { 
    @Override public void keyPressed(KeyEvent e) { 
     if(e.keyCode >=48 && e.keyCode <=57) { 
      System.out.println("number caught"); 
     } 
    } 
}); 

Но у меня будет больше входов в моем приложении, поэтому мне нужно знать, если он посылает считыватель штрих-кода или с помощью клавиатуры. Я думаю, что это может быть достигнуто добавлением некоторого таймера в код, который проверяет, сколько времени занимает некоторая «последовательность» чтения.

Я просто не могу понять это (я имею в виду логику за ним), мне не хватает части логики.

  1. Пользователь печатает некоторую информацию, (альфа-цифровой)
  2. ПОСТОНАВЛЯЕТ пользователя использовать считыватель штрих-кодов для чтения штрих-кода

Я попытался таймера, например if(System.currentTimeMillis() - lastPressProcessed ??? 500) { после KeyListener срабатывает, но я думаю, что мне не хватает что нибудь.

Sidenote: USB штрих-кода считывает код быстро, так что нажатие клавиш эмулированную очень быстро EST весь штрих-код записывается примерно 1 секунду + переносная /r/n (также enter нажата).

sidenote2: штрих-коды будут отличаться по длине, так что я не могу читать только некоторые длины в короткое время и решить, кастрированный баран это пользовательский ввод или ввод штрих-кода (макс числа чтения 13 + enter).

sidenote3: У меня нет поля ввода для штрих-кода. Я пытаюсь запустить его на «фон».

Я ищу логические/псевдокодовые предложения по теме.

связанные темы, которые действительно близки к шахте here и here

Спасибо.

редактировать

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

решение --moved ответить + отредактирован

+0

Вы можете отправить решение в качестве ответа и выбрать его, если оно решит вашу проблему. Однако я не думаю, что ваш код делает то, что вы думаете. Вы говорите, что «весь штрих-код записывается примерно через 1 секунду», но ваш код позволяет пройти 1 секунду между двумя нажатиями клавиш и по-прежнему обрабатывает вход в качестве входа сканера! «У меня нет поля ввода для штрих-кода», есть ли у вас другие поля ввода, и вы пытаетесь предотвратить сканирование данных в эти поля? – Enrico

+0

Всякий раз, когда/r/n передается в программный цикл, «закрывается», считывается штрих-код. Я изменил время на 200 мс, меня беспокоило системное «отставание». Я думаю, что этот код отвечает моим потребностям, я знаю, что он не идеален, но в этом вопросе я обновляю свое решение, потому что внес некоторые изменения. Я знаю, что могу отправлять ответы, но я должен ждать 2 (1?) Дня, чтобы принять его. Не будет ввода Java, но HTML один. Программа Java предназначена для чтения штрих-кодов и отправки их на веб-страницу. – Kyslik

+0

Также я не беспокоюсь о смешивании ввода данных с помощью штрих-кодов. В режиме «редактирования» сканер штрих-кода будет «выключен» (в программном обеспечении). Пожалуйста, сделайте больше предложений, если вы считаете, что это необходимо. – Kyslik

ответ

0

Этот код договору включает все, что я хотел достичь, он читает только цифры (actualy номера, которые находятся под клавишами F, а не цифры, которые находятся на цифровой клавиатуре, я имел проблема с ним, потому что сканер зависит от клавиатуры, поэтому я сделал функцию signsToNumbers(), которая преобразует знаки [email protected]#$%^&*() в номера 1234567890.Я могу изменить эту функцию, потому что каждый ключ на клавиатуре имеет свой собственный уникальный идентификатор + модификатор, кажется, что сканер отправляет в приложение также модификатор SHIFT но это не проблема, как кажется, я просто буду соответствовать e.keyCode.

Код ниже работает как:

  1. ожидает ввода номера в противном случае ничего не делает
  2. , если первая цифра будет вставлена ​​его зацикливание в if состоянии, пока либо 200мс не будет достигнуто или «\ г \ n` является полученные
  3. отправляет данные на сервер с помощью URL

код

@Override public void keyPressed(KeyEvent e) { 
    if (timer == true && System.currentTimeMillis() - lastTimer < 200) { 
     if(e.keyCode >=48 && e.keyCode <=57) { //number pressed 
      lastTimer = System.currentTimeMillis(); 
      myString = myString + Character.toString(e.character); 
     } 
     if(e.keyCode == SWT.CR) { 
      myString = signsToNumbers(myString); 
      newUrl = browser.getUrl()+ "/newcode/" + myString; 
      browser.setUrl(newUrl); 
      text.setText(newUrl); 
      System.out.println(myString); 
      System.out.println("barcode read"); 
      myString = ""; 
      timer = false; 
      lastTimer = 0; 
     } 
    }else{ 
     if(e.keyCode >=48 && e.keyCode <=57) { 
      lastTimer = System.currentTimeMillis(); 
      timer = true; 
      myString = Character.toString(e.character); 
     } 
     myString = ""; 
     lastTimer = 0; 
    }   
    } 
}); 
+0

Пожалуйста, предоставьте свой ответ самим таймером! –

+0

Что это значит? Я использую системный таймер. – Kyslik

+0

Я думаю, было бы здорово, если бы вы могли расширить свой ответ с помощью дополнительного таймера en timertask. –

1

Здесь вы можете скачать мое решение:

http://jhead.hu/resource/java/general/BarcodeReader.java

Следующий пример кода показывает, как использовать его. Когда идентифицируется новый штрих-код, создается ActionEvent, и вы можете получить штрих-код через метод getActionCommand(). Если панель не активна, вы можете отправить символы в диспетчер фокуса.

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

public class PanelWithBarcodeReading extends javax.swing.JPanel implements ActionListener { 

    private BarcodeReader barcodeReader = new BarcodeReader(); 

    public PanelWithBarcodeReading() { 
     initComponents(); 
     barcodeReader.addActionListener(this); 
     barcodeReader.setParent(this); 
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(barcodeReader); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (SwingUtilities.getWindowAncestor(this).isActive()) { 
      System.out.println("BARCODE='" + e.getActionCommand() + "'"); 
     } else { 
      barcodeReader.dispatchLastBarcodeAsKeyEvents(); 
     } 
    } 

    ... 
} 
+0

приятно, спасибо за усилия, попробуй – Kyslik