在Java中处理条形码扫描[英] Handle barcode scan in Java

问题描述

我想让我的应用程序对被扫描的条形码作出反应,以触发按钮按下.例如,用户可以扫描((print))条形码以激活打印按钮.

条形码将被视为好像用户输入了一些文本.我不确定扫描仪是否将被设置为追加输入或者标签或最后一端,因此我不想在此基础上进行假设.

应用程序是Java/Swing应用程序.

我看过键绑定/动作映射等,但它们似乎专注于关键和弦/单键条目.我需要它无法触发绑定,直到输入整个字符串.

棘手的位是,这应该在用户聚焦在屏幕中的任何地方工作.它们通常不会进入(字符,所以某种可能工作的触发器.我不确定如何处理剩下的字符串.

编辑:道歉如果问题不清楚,但条形码扫描仪对应用程序没有任何"特殊",它就像另一个键盘一样.所以用户不会在(打印)中键入(打印),但有效地是条形码扫描仪将在做什么,如果这有意义.

所以只有两种方法可以触发打印:按下按钮,或"键入"字符串(打印).棘手的部分是用户可以在应用程序上的任何位置聚焦.我只担心应用程序的整体焦点,而不是哪个字段专注于用户.有问题的特定屏幕上有核心特权和左/右选择器,因此用户不一定会输入一个字段.

推荐答案

我有一个问题,就像你的问题,并创建了一个项目(目前有一些问题的概念证明),使条形码处理变得更容易.

是基于条形码读取器模拟键盘但与人类不同,以恒定的定时为基础.它基本上允许您收听"条形码读取"事件.

项目位置: https://github.com/hableutzel1/swingbarcodelistener

演示用法:

public class SimpleTest extends JFrame {
    public SimpleTest() throws HeadlessException {

        // start of listening for barcode events
        Toolkit.getDefaultToolkit().addAWTEventListener(new BarcodeAwareAWTEventListener(new BarcodeCapturedListener() {
            @Override
            public void barcodeCaptured(String barcode) {
                JOptionPane.showMessageDialog(SimpleTest.this, "barcode captured: " + barcode);
            }
        }), AWTEvent.KEY_EVENT_MASK);
        // end of listening for barcode events


        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(new JLabel("Capture barcode demo"));
        getContentPane().add(new JTextField(25));
    }

    public static void main(String[] args) {
        SimpleTest simpleTest = new SimpleTest();
        simpleTest.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        simpleTest.setVisible(true);
        simpleTest.pack();
    }
}

现在有一些问题,但作为一个起点,我认为它没问题,如果你有时间改善它会很棒.

其他推荐答案

如果我错过了,请纠正我,但听起来你有一个条形码扫描仪,它将在一个字段中输入文本.但是,当字段中的文本等于某些东西时,您希望得到警告(因此可以进行操作),无论如何输入它(按条形码扫描仪或按键).

我建议使用a DocumentListener提醒您对文本字段的更改 - 这应该适用于您的两个要求.

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class TempProject extends Box{

    public TempProject(){
        super(BoxLayout.Y_AXIS);
        final JTextArea ta = new JTextArea();
        ta.getDocument().addDocumentListener(new DocumentListener(){

            @Override
            public void changedUpdate(DocumentEvent arg0) {
                doSomething();
            }

            @Override
            public void insertUpdate(DocumentEvent arg0) {
                doSomething();
            }

            @Override
            public void removeUpdate(DocumentEvent arg0) {
                doSomething();
            }

            public void doSomething(){
                if(ta.getText().equalsIgnoreCase("print")){
                        System.out.println("Printing...");
                        //Need to clear text in a separate swing thread
                        SwingUtilities.invokeLater(new Runnable(){
                            @Override
                            public void run() {
                                ta.setText("");
                            }});
                }
            }

        });

        add(ta);
    }


    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                frame.setContentPane(new TempProject());
                frame.setPreferredSize(new Dimension(500, 400));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }   


}

其他推荐答案

我不完全理解这个问题,这有点太长了.据我所知,你有一个挥杆应用程序和一个条形码扫描程序,它有3种不同的方式来触发相同的操作

  • 用户在UI中输入某些文本("打印"),此触发打印操作
  • UI有一个打印按钮,可以由用户按下,并且这触发了打印动作
  • 用户可以扫描"打印"条形码,这触发了打印动作

我不明白的部分是为什么扫描条形码应该触发打印动作,与用户可以输入文本的UI部分有任何关系.

我假设条形码的扫描发生在另一个螺纹上,然后发生事件调度线程.一旦扫描条形码并解析了它,您需要触发"打印"操作.你可以直接做到这一点而不打扰通过UI.

本文地址:https://www.itbaoku.cn/post/978567.html