我在这里找到了一些关于我的问题的很好的问答,但找不到合适的。
我有一个barcode reader读取条形码并将扫描的代码作为键盘输入发送。没关系,我可以轻松捕捉输入
browser.addKeyListener(new KeyAdapter() {
@Override public void keyPressed(KeyEvent e) {
if(e.keyCode >=48 && e.keyCode <=57) {
System.out.println("number caught");
}
}
});
但是我的应用程序中会有更多输入,因此我需要知道它是通过条形码阅读器还是通过键盘发送。 我认为这可以通过在代码中添加一些计时器来验证某些“序列”读取的时间来实现。
我只是无法弄清楚(我的意思是背后的逻辑),我缺少逻辑。
- 用户正在输入一些信息(字母数字)
- 用户决定使用条形码阅读器来读取条形码
我尝试过计时器,例如
if(System.currentTimeMillis() - lastPressProcessed ??? 500) {
在 keyListener 被触发后,但我认为我错过了一些东西。
旁注:
USB 条形码读取代码速度快,因此模拟击键速度非常快,整个条形码在大约 1 秒内写入 + 进位 /r/n
(也按下 enter
)。
sidenote2:条形码的长度会有所不同,因此我无法在短时间内读取某些长度并决定是用户输入还是条形码输入(最大读取数量 13 + 输入
)。
sidenote3:我没有条形码输入字段,我试图在“背景”上运行它。
我正在寻求有关主题的逻辑/伪代码建议。
谢谢。
编辑
经过深入思考,我找到了解决方案,我将把这个问题保留在这里,仅供其他可能发现它有用的用户使用。
解决方案 --移至答案+编辑
最佳答案
这段代码涵盖了我想要实现的一切,它只读取数字(实际上是 F 键下的数字,而不是小键盘上的数字,我遇到了问题,因为扫描仪依赖于键盘,所以我制作了函数 signsToNumbers ()
将符号 !@#$%^&*()
转换为数字 1234567890
。我可能会更改此功能,因为键盘上的每个键都有自己的唯一标识符 + 修饰符,扫描仪似乎还向应用程序发送 SHIFT 修饰符,但这并不像我看起来那样问题,我只是匹配 e.keyCode
。
下面的代码工作原理如下:
- 等待数字输入,否则不执行任何操作
- 如果插入第一个数字,它将在
if
条件下循环,直到达到 200ms 或收到“\r\n” - 通过 URL 将数据发送到服务器
代码
@Override public void keyPressed(KeyEvent e) {
if (timer == true && System.currentTimeMillis() - lastTimer < 200) {
if(e.keyCode >=48 && e.keyCode <=57) { //number pressed
lastTimer = System.currentTimeMillis();
myString = myString + Character.toString(e.character);
}
if(e.keyCode == SWT.CR) {
myString = signsToNumbers(myString);
newUrl = browser.getUrl()+ "/newcode/" + myString;
browser.setUrl(newUrl);
text.setText(newUrl);
System.out.println(myString);
System.out.println("barcode read");
myString = "";
timer = false;
lastTimer = 0;
}
}else{
if(e.keyCode >=48 && e.keyCode <=57) {
lastTimer = System.currentTimeMillis();
timer = true;
myString = Character.toString(e.character);
}
myString = "";
lastTimer = 0;
}
}
});
关于Java swt KeyListener "solution"条码读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401612/