12
votes

Obtenir une entrée à partir d'un scanner de code à barres en interne sans zone de texte

J'ai un scanner de code à barres et dans mon application Java, je dois apporter une pop up pour afficher toutes les informations associées au code à barres à partir de la base de données lorsque le produit est numérisé à l'aide de code à barres. Je n'ai aucune zone de texte sur l'application que je dois gérer cette partie en interne. Comment puis-je faire cela ? toute suggestion ? J'utilise Swing pour UI.

Modifier

Scanner de code à barres est USB One. Si nous numérisons quelque chose, cela émettra le résultat dans la zone de texte qui se concentre. Mais je n'ai aucune zone de texte travaillant sur la page ouverte. Puis-je travailler avec une zone de texte cachée et lire la valeur là-bas?


13 commentaires

Je ne suis pas sûr de ce que vous demandez (vote par le bas de moi).


Nécessite définitivement beaucoup plus de détails. Le scanner de code à barres est-il une partie de votre application ou d'une application autonome tierce? De quoi avez-vous besoin de champ Textbox? Comment / devrait / peut-il communiquer avec votre application?


Généralement, les scanners de code à barres sont des dispositifs HID unis qui fonctionnent comme le clavier - Envoyer des frappes à la fenêtre de la fenêtre. Vous pouvez essayer de capturer les frappes de frappe dans votre application.


Oui, je pourrais obtenir les coups de frappe mais comment puis-je informer la demande TAT A BEYSTRAKE a commencé à arriver avant que je transfère la mise au point sur un champ de texte? \


Qu'est-ce que le type de données (image, octet, flux ...) est possible sur la sortie du scanner, l'API ou le pilote doit dire quelque chose à ce sujet.


La sortie est quelque chose comme ça? 20003;


@Deepak Vous n'avez pas besoin d'informer l'application à ce sujet, il s'agit d'une œuvre pour le système GUI. Dans votre scénario à un moment donné, l'application réalise qu'il est nécessaire de recevoir un code à barres, il se contente d'une fenêtre invitant l'utilisateur à effectuer la numérisation tout en capturant toute touche qu'il reçue éventuellement la sortie de la fenêtre. L'analyse est terminée lorsque l'utilisateur appuie sur OK et / ou l'application reçoit un code à barres valide (suffisamment de chiffres).


Mais comment puis-je déclencher un événement comme PopUp lorsque la numérisation est terminée? En d'autres termes, l'application ne connaît rien jusqu'à ce que la numérisation soit terminée. Alors, comment gérer ce problème?


@Deepak pour que l'application ne sait pas quand attendre la numérisation? Dans ce cas, il peut accepter n'importe quelle touche numérique tout en mesurant le temps entre eux - Scanner de code à barres envoie généralement des frappes suffisamment rapidement avec le même taux. Cela permettra à l'application de distinguer grossièrement (accident) Keystrokes par utilisateur de Keystrokes par Scanner. C'est le moyen facile. Ou si le scanner a du SDK ou si vous remplissez comme un pilote d'écriture, vous pouvez communiquer directement (c'est la solution difficile).


`Dans ce cas, il peut accepter n'importe quelle touche numérique tout en mesurant le temps entre eux» je ne vous ai pas correctement. Je suis désolé pouvez-vous m'expliquer?


@Deepak L'application doit en quelque sorte reconnaître les séquences de frappe de frappe comme entrée du scanner. Étant donné que les frappes peuvent être déclenchées par l'utilisateur avec un clavier régulier, je suggère comment distinguer la saisie du scanner à partir de l'entrée de l'utilisateur. Le scanner envoie des frappes rapides et au même tarif (je suppose), donc si l'application reçoit suffisamment de frappes et à un taux stable, il peut être presque sûr du scanner.


Alors, comment puis-je recevoir les frappes de frappe sans avoir un champ de texte ciblé?


@Deepak je n'ai jamais travaillé avec balançoire, mais vous pouvez poser cette nouvelle question.


3 Réponses :


9
votes

Etant donné que le scanner de code à barres n'est qu'un périphérique qui envoie des codes clés et entrez après la lecture de chaque code à barres, j'utiliserais un auditeur clé.

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 commentaires

Le problème avec celui-ci est que l'utilisateur pourrait simplement appuyer sur certaines touches avec son clavier, puis appuyez sur Entrée et l'application prendrait cela en tant que code à barres capturé. De plus, chaque lecteur de code à barres n'envoie pas un suffixe Entrée Char



7
votes

Étant donné que cela n'a pas été en mesure d'obtenir une entrée via cadre.addkeylistener, j'ai utilisé cette classe utilitaire qui utilise 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);
}

}


1 commentaires

Très bonne solution, mais il y a des lecteurs de code à barres qui n'envoient pas à entrer le suffixe de clé Entrée par défaut et, avec votre code, je ne vois aucun moyen de capturer un code à barres si l'entrée n'est pas envoyée à la fin.



1
votes

D'une certaine manière similaire à la solution @Cyrusmith, j'ai créé une solution de «preuve de concept» (avec plusieurs limitations actuellement, mais vous êtes invité à les réparer :)) Essayer de résoudre les limitations des solutions précédentes dans ce poste. :

  • Il prend en charge les lecteurs de code à barres qui n'envoient pas l'entrée à la fin de la chaîne de code à barres.
  • Si l'accent est actuellement sur un composant de texte Swing et code à barres est capturé, le code à barres n'atteint pas le composant texte et uniquement à l'auditeur de code à barres.

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


0 commentaires