1

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

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

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

我看过键绑定/动作映射等,但它们似乎集中在键和弦/单键条目上。我需要它在输入整个字符串之前不触发绑定。

棘手的一点是,这应该在用户专注于屏幕的任何地方都有效。他们通常不会输入 ( 字符,因此某种触发器可能会起作用。我不确定如何处理字符串的其余部分。

编辑:抱歉,如果问题不清楚,但条形码扫描仪对应用程序来说并没有什么“特殊”,它就像另一个键盘。因此,用户不会输入(打印),但实际上这就是条形码扫描仪所做的事情,如果这有意义的话。

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

4

4 回答 4

3

我遇到了和你一样的问题,并创建了一个项目(目前存在一些问题的概念证明),以使摇摆中的条形码处理更容易。

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

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

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

于 2014-02-28T01:47:06.917 回答
1

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

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

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

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

于 2012-08-30T16:18:05.517 回答
1

如果我理解错了,请纠正我,但听起来你有一个条形码扫描仪,可以将文本输入到一个字段中。但是您希望在字段中的文本等于某个值时收到警报(因此可以执行操作),而不管它是如何输入的(通过条形码扫描仪或按键)。

我建议使用 aDocumentListener来提醒您文本字段的更改 - 这应该符合您的两个要求。

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);
            }
        });
    }   


}
于 2012-08-30T15:06:31.703 回答
1

这是我的方法。它正在工作。只需获取毫秒以确保不会读取两次。只需添加一个 Key Listener(在同一个 JFrame 中实现)。

  @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
        logger().info("keytyped" + e.getKeyChar() + " code "+e.getKeyCode());
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            logger().info("all keys " + keyspressed);
            return;
        }
        // will not last more than a second...
        if (keyspressed == null || System.currentTimeMillis() - currentTimeMillis > 1000) {
            keyspressed = e.getKeyChar()+"";
            currentTimeMillis = System.currentTimeMillis();
        } else {
            keyspressed = keyspressed + e.getKeyChar();
            currentTimeMillis = System.currentTimeMillis();
        }
    }

    private String keyspressed = null;
    private long currentTimeMillis = System.currentTimeMillis();
于 2019-09-02T11:31:12.587 回答