用Java处理条形码扫描

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

条形码将被视为用户输入了一些文本。 我不确定扫描仪是否会设置为附加一个输入或选项卡或者最后没有任何内容,因此我不想在此基础上做出假设。

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

我查看了键绑定/动作地图等,但它们似乎专注于键和/单键输入。 我需要它才能在输入整个字符串之前不触发绑定。

棘手的一点是,这应该适用于用户在屏幕上聚焦的任何地方。 它们通常不会输入(字符,所以某种触发器可能会起作用。我不知道如何处理其余的字符串。

编辑:道歉,如果在问题中不清楚,但条形码扫描仪对应用程序不是什么“特殊”,它就像另一个键盘。 因此用户不会输入(打印),但有效的是条形码扫描器将要做的事情,如果这是有道理的。

因此,只有两种方法可以触发打印:按下按钮或“键入”字符串(打印)。 棘手的部分是用户可以专注于应用程序的任何位置。 我只担心应用程序是否具有整体焦点,而不是用户关注的字段。 有问题的特定屏幕上有支票按钮和左/右选择器,因此用户不一定要输入字段。

如果我误解了,请纠正我,但听起来你有一个条形码扫描仪会将文字输入一个字段。 但是,当字段中的文本等于某事时(因此可以发生操​​作),无论输入的方式如何(通过条形码扫描仪或按键),您都希望收到警报。

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

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

  • 用户在UI中输入一些文本(“打印”),这会触发打印操作
  • UI具有可由用户按下的打印按钮,这触发打印动作
  • 用户可以扫描“打印”条形码,这会触发打印操作

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

我假设条形码的扫描发生在另一个线程上,然后是事件调度线程。 扫描条形码并解析后,您需要触发“打印”操作。 您可以直接执行此操作,而无需通过UI进行操作。

我遇到了与你一样的问题,并创建了一个项目(目前有一些问题的概念certificate),使得摆动条码处理变得更容易。

它的基础是条形码阅读器模拟键盘,但与人类不同,它们以恒定的时间“键入”。 它基本上允许您收听“条形码读取”事件。

项目位置: 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(); } } 

它现在有一些问题,但作为一个起点,我认为没关系,如果你有时间去改进它会很棒。