0

我创建了一个带有输入文本的简单 Swing 应用程序来读取条形码并在输出文本中打印 GS 字符位置。

前任:

输入:01070462616434291722010010Y0238921MA3W7J59UC2W111(从条形码扫描仪获取)

输出:GS1 在位置 = 32

正常的摇摆应用程序可以正常工作,但是当为键事件处理器创建一个小延迟时(为每个键事件添加 Thread.sleep(2) )有时此输出不存在,因为正在生成其他字符而不是 GS 字符。(添加延迟的原因是,在生产代码中,synthena 用于在摇摆应用程序中添加外观和感觉,并且由于该过程,关键事件似乎存在一些延迟。因此在这个简单的应用程序中强行添加延迟只是为了模拟问题。 )

有时甚至认为GS不会来但GS角色的字符序列每次都非常相同

GS 字符序列 -> ALT + 0 + 0 + 2 + 9

这里打印了GS字符的按键和释放键序列(这只是为了验证按键和释放时的字符序列,不包含在最近的代码中)

关键事件 核心价值 键字符
按键 65535(ALT 键)
按键 0 48
钥匙释放 0 48
按键 0 48
钥匙释放 0 48
按键 2 50
钥匙释放 2 50
按键 9 57
钥匙释放 65535(ALT 键)
键入的键 29

这是一个正确的场景,GS 字符的输入与最后一行一样(键字符 29 是 GS 字符),但在不正确的场景中,所有其他键事件都相同,但键输入的字符不同

这是源代码

SwingApp

import java.awt.*;

public class SwingApp {

    public static void main(String[] args) {
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(keyEvent -> {
            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return false;
        });
        EventQueue.invokeLater(() -> new ScannerWindow().show());
    }
}

扫描仪窗口

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

public class ScannerWindow {

    private int i;
    private final JFrame f;

    public ScannerWindow(){
        f = new JFrame();
        f.setLayout( null);

        JTextArea ta = new JTextArea();

        JTextField txt=new JTextField();
        txt.setBounds(130,20,300, 40);
        txt.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {

                if(e.getKeyChar() == 29){
                    ta.append("\n GS1 on position = " + i);
                }
                i++;
            }
        });
        f.add(txt);

        JButton b = new JButton("Clear");
        b.addActionListener(e -> {
            ta.setText("");
            txt.setText("");
            i = 0;
        });
        b.setBounds(130,80,100, 40);
        f.add(b);

        ta.setBounds(50, 130, 400, 300);
        f.add(ta);

        f.setSize(600,500);
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

    public void show()
    {
        f.setVisible(true);
    }
}

有人可以帮我吗?

4

0 回答 0