2011-07-18 23 views
9

我有一個條形碼掃描儀,並且在我的Java應用程序中,當使用條形碼掃描產品時,必須帶一個彈出窗口來顯示與數據庫中條形碼相關的所有信息。我沒有應用程序上的文本框,我必須在內部處理這部分。我該怎麼做呢 ?任何建議?我正在使用swing進行用戶界面。在沒有文本框的情況下從條形碼掃描儀獲取輸入

編輯

條碼掃描器是USB之一。如果我們掃描一些東西,它會將結果輸出到具有焦點的文本框中。但我沒有在打開的頁面上工作的文本框。我可以使用一些隱藏的文本框並閱讀其中的值嗎?

+0

我不知道你問(反對票不是從我)的東西。 – Moonbeam

+0

肯定需要更多的細節。條形碼掃描儀是您的應用程序還是第三方獨立應用程序的一部分?你需要什麼文本框?條形碼掃描器如何/應該/可以與您的應用程序進行通信? – bezmax

+1

檢查我的編輯.. – Deepak

回答

5

由於條形碼掃描儀只是一個設備,在讀取每個條形碼後發送鍵碼和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

這個問題在於用戶只需用鍵盤按下一些按鍵,然後按下ENTER鍵,應用程序會將其作爲捕獲的條形碼。此外,並非每個條形碼閱讀器都會發送ENTER後綴char –

5

由於無法通過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); 
} 

} 
+0

非常好的解決方案,但是有些條形碼閱讀器默認情況下不會發送ENTER鍵後綴,而且如果您沒有發送ENTER,您的代碼我看不到任何方法來捕獲條形碼最後 –

0

以類似於@Cyrusmith解決一些方法,我創建了一個「證明概念'的解決方案(現在有幾個限制,但你被邀請去修復它們:))試圖解決在這篇文章中以前的解決方案的限制:

  • 它支持條形碼閱讀器噸帽子不會在條碼字符串的末尾發送ENTER。
  • 如果焦點當前位於擺動文本組件和條形碼被捕獲,則條形碼不會到達文本組件,而只會到達條形碼偵聽器。

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

相關問題