我创建了一个带有输入文本的简单 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);
}
}
有人可以帮我吗?