处理Java中的条码扫描(Handle barcode scan in Java)

2019-06-27 13:59发布

我希望有我的应用程序反应被扫描条形码触发按钮按下。 例如,用户可以扫描((PRINT))条码以激活打印按钮。

条形码只会被视为如果用户已经进入了一些文字。 我不知道,如果扫描仪将设置追加对端输入或一个标签或什么都没有,所以我不想做这个基础上的假设。

该应用程序是一个Java / Swing应用程序。

我已经看过键绑定/动作映射等,但他们似乎在关键和弦/单键条目被聚焦。 我需要它不会触发绑定,直到输入整个字符串。

棘手的一点是,这应该工作无论用户在屏幕上聚焦。 他们将无法正常进入(字符,所以在某些类型的触发可能会奏效。我不知道如何处理,虽然该字符串的其余部分。

编辑:如果道歉是没有问题的清楚,但条形码扫描仪是没有什么“特殊”的应用程序,它就像另一个键盘。 所以用户不会打字的(打印),但有效的是什么条形码扫描器会做,如果是有道理的。

因此,只有两种方式来触发打印:按下按钮,或“输入”的字符串(打印)。 最棘手的部分是,用户可以在任何地方应用集中。 我只是担心如果应用集中作为一个整体,而不是该领域的用户上集中。 有问题的特定的屏幕上有checkbuttons和左/右选择,因此用户并不一定会被输入到一个领域。

Answer 1:

我有一个问题,就像你的,并创建了一个项目(概念的一些问题,目前的证据),使条形码处理在挥杆更容易。

它是基于一个事实,即条形码阅读器模拟键盘,但不同的人类,他们的“类型”有一定的时间。 它基本上允许你听“条形码读取”的事件。

项目位置: https://github.com/hablutzel1/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();
    }
}

它现在有一些问题,但作为一个起点,我认为它是好的,如果你有时间去改进它,将是巨大的。



Answer 2:

纠正我,如果我missunderstood,但它听起来像是你有一个条形码扫描仪,将文本输入的字段。 但要提醒,无论它是如何输入的(由条码扫描器或按键)时,在该领域的文本等于什么(所以动作可发生)。

我建议你使用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);
            }
        });
    }   


}


Answer 3:

我不完全理解的问题,这是一个有点太长加入了注释。 据我的理解是,你有一个Swing应用程序,并且有3点不同的方式来触发相同的操作条形码扫描器

  • 用户输入的UI一些文字(“打印”),这将触发打印动作
  • 该UI可以由用户按压打印按钮,这触发了打印动作
  • 用户可以扫描“打印”条形码和这触发了对打印动作

我不明白的部分是为什么条形码扫描,应触发打印动作,有什么做的UI部分,用户可以输入文本。

我假定条形码的扫描发生在另一个线程则在事件指派线程。 一旦你扫描的条形码和解析它,你需要触发了“打印”操作。 您可以在不打扰通过UI直接去做到这一点。



文章来源: Handle barcode scan in Java