最佳答案
它应该类似于Java Swing解决方案presented here.
我假设来自条形码扫描仪的最终字符是ENTER.如果没有,您必须检查如何知道条形码何时完成,例如通过预期的长度或通过测试关键事件或其他之间的总计时间.
条形码扫描器的KeyEvents应该很快,因此两个事件之间的时间应该相当短.要过滤掉手动输入,如果事件太慢,则会重置StringBuffer.
在KeyListener中,您现在可以实现此方法:
private final StringBuffer barcode = new StringBuffer();
private long lastEventTimeStamp = 0L;
// ...
public void keyTyped(KeyEvent keyEvent) {
long Now = Instant.Now().toEpochMilli();
// events must come fast enough to separate from manual input
if (Now - this.lastEventTimeStamp > this.threshold) {
barcode.delete(0,barcode.length());
}
this.lastEventTimeStamp = Now;
// ENTER comes as 0x000d
if (keyEvent.getCharacter().charat(0) == (char) 0x000d) {
if (barcode.length() >= this.minBarcodeLength) {
System.out.println("barcode: " + barcode);
}
barcode.delete(0,barcode.length());
} else {
barcode.append(keyEvent.getCharacter());
}
keyEvent.consume();
}
这只是一个粗略的实现,可能需要一些微调,但我已经在一个用于GridPane的FXML控制器中测试它,而对于条形码扫描器,我有它的工作原理.
注意:KeyEvent.KEY_TYPED does not have the KeyCode set,所以你不能这样做:
if (event.getCode().equals(KeyCode.ENTER)) {
//...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。