我有条形码扫描仪,当我专注于文本字段时,我可以像键盘一样毫无问题地读取输入。
我的问题是,如果我不关注文本字段,我如何读取条形码输入,换句话说,如何让事件监听器监听条形码扫描器。
最佳答案
它的工作方式应该类似于 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();
}
这只是一个粗略的实现,可能需要进行一些微调,但我已经在 FXML Controller 中针对 GridPane 和条形码扫描仪对其进行了测试。
注意: KeyEvent.KEY_TYPED does not have the KeyCode set ,所以你不能这样做:
if (event.getCode().equals(KeyCode.ENTER)) {
//...
}
关于java - 如何使用 JavaFX 从条码扫描仪读取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31513374/