2012-08-30 69 views
0

我希望让我的应用程序对正在扫描的条形码作出反应,以触发按钮按下。例如,用户可以扫描((打印))条形码以激活打印按钮。在Java中处理条形码扫描

条形码将被视为用户输入了一些文字。我不确定扫描仪是否会设置为追加输入或选项卡或最终没有任何内容,所以我不想在此基础上作出假设。

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

我曾看过keybindings/action maps之类的东西,但它们似乎专注于键和弦/单键条目。我需要它不会触发绑定,直到输入整个字符串。

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

编辑:道歉,如果它不明确的问题,但条形码扫描器对于应用程序来说并不是什么“特殊”,它就像另一个键盘一样,所以用户不会输入(打印),但实际上条形码扫描器将会这样做,这是有道理的。

所以只有两种方法可以触发打印:按下按钮或“打字”字符串(打印)。棘手的部分是用户可以在应用程序的任何位置进行聚焦,我只是担心如果应用程序的整体焦点不在于哪个字段是用户关注的焦点。所涉及的特定屏幕有checkbu ttons和左/右选择器,因此用户不一定要输入字段。

+0

即使您的应用程序没有焦点,您仍需要获取键盘输入吗? (对不起,我没有理解那部分。)也许这会帮助:[java.awt.KeyListener](http://docs.oracle.com/javase/6/docs/api/java/awt/event/ KeyListener.html)和[如何编写关键侦听器](http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)。 –

回答

1

纠正我,如果我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); 
      } 
     }); 
    } 


} 
+0

假设他允许有一个文本字段,这是一个+1 – MadProgrammer

+1

不幸的是,用户不会在文本字段中编辑文本,他们可能是点击复选框或组合框等,所以我不能真正依靠这个解。谢谢anywyay。 –

+1

难道你只是让文本框始终被选中。 EG当他们点击复选框或组合框时,光标返回到文本框??不知道你的应用程序,所以不知道这是否会! – geekman92

1

我不完全理解这个问题,并且这太长了以至于无法发表评论。据我的理解是,你有一个Swing应用程序,并且有3点不同的方式来触发相同的操作

  • 用户输入的用户界面的一些文字(“打印”),条形码扫描仪,这触发打印动作
  • 的UI具有可通过用户按压打印按钮,这触发了打印动作
  • 用户可以扫描“打印”条码并且这触发打印动作

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

我假设扫描条形码发生在另一个线程上,然后是事件调度线程。一旦你扫描条码并解析它,你需要触发“打印”动作。您可以直接执行此操作,而不必烦恼通过用户界面。

+0

想想商店中的某个人,而不必点击“打印”按钮,他们可以使用预定义的“条形码”卡执行操作 - 您可以在店员登录时看到很多。我想象它是相同的过程... +1虽然 – MadProgrammer

+0

@MadProgrammer但是为什么还要从条形码 - >文本 - >动作,而不仅仅是条形码 - >动作(其中动作可能具有关于什么的UI指示它正在做/将要做) – Robin

+0

我认为这就是他想要做的......条形码 - >动作就是这样。我个人将一个监听器附加到'AWTEventQueue'上,但是如何告诉人们输入“PRINT”和条形码之间的区别? – MadProgrammer

0

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

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

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

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