2011-07-18 17 views
9

Ho uno scanner di codici a barre e nella mia applicazione java devo portare un popup per visualizzare tutte le informazioni associate al codice a barre dal database quando il prodotto viene scansionato usando il codice a barre. Non ho una casella di testo sull'applicazione che devo gestire internamente questa parte. Come faccio a fare questo ? qualche suggerimento ? Sto usando swing per l'interfaccia utente.Ottenere input dal lettore di codici a barre internamente senza casella di testo

EDIT

scanner di codici a barre è uno USB. Se scansioniamo qualcosa, il risultato verrà stampato nella casella di testo che ha il focus. Ma non ho nessuna casella di testo che funzioni sulla pagina aperta. Posso lavorare con qualche casella di testo nascosta e leggere il valore lì?

+0

Non sono sicuro di quello che stai chiedendo (down-voto non da me). – Moonbeam

+0

Richiede sicuramente molti più dettagli. Lo scanner di codici a barre è una parte dell'applicazione o di un'applicazione indipendente di terze parti? A cosa serve il campo della casella di testo? In che modo/dovrebbe/può il barcode scanner comunicare con la tua applicazione? – bezmax

+1

controlla la mia modifica .. – Deepak

risposta

5

Poiché il lettore di codici a barre è solo un dispositivo che invia codici chiave e INVIO dopo aver letto ciascun codice a barre, utilizzerei un ascoltatore di chiavi.

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

Il problema con questo è che l'utente può semplicemente premere alcuni tasti con la sua tastiera e quindi premere INVIO, e l'applicazione lo prenderà come codice a barre catturato. Inoltre, non tutti i lettori di codici a barre inviano un suffisso ENTER char –

5

Dal momento che non era in grado di ricevere input tramite frame.addKeyListener Ho usato questa classe di utilità che utilizza 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

Ottima soluzione, ma alcuni lettori di codici a barre non inviano il suffisso tasto INVIO per impostazione predefinita e con il codice non riesco a vedere un codice a barre se INVIO non viene inviato alla fine –

0

In qualche modo simile alla soluzione @Cyrusmith ho creato una 'prova di concetto 'soluzione (con diverse limitazioni in questo momento, ma sei invitato a risolverli :)) cercando di risolvere i limiti delle soluzioni precedenti in questo post:

  • Supporta lettori di codici a barre t hat non invia l'INVIO alla fine della stringa del codice a barre.
  • Se lo stato attivo è attualmente su un componente di testo mobile e il codice a barre viene acquisito, il codice a barre non arriva al componente testo e solo al listener del codice a barre.

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

Problemi correlati