java - 如何使用 JavaFX 从条码扫描仪读取输入

标签 java javafx

我有条形码扫描仪,当我专注于文本字段时,我可以像键盘一样毫无问题地读取输入。

我的问题是,如果我不关注文本字段,我如何读取条形码输入,换句话说,如何让事件监听器监听条形码扫描器。

最佳答案

它的工作方式应该类似于 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/

相关文章:

Java 扫描器在循环期间不阻塞

JavaFx:如何更新 GridPane 内动态创建的 TextField 的文本?

java - 如果 getter 方法中的对象为空,如何将文本字段设置为定义的值

java - 如何将抗锯齿应用于 GraphicsContext.fillArc() 等 javafx 方法?

JavaFX NumberAxis AutoRange 无限循环

Java——最高效的匹配方法

java - 问 : Updating a ProgressBar with real results (includes code)

java - 用 jar 打开时图像不可见。升级 javaFx 后创建新图像需要完整目录

java - SpringSecurity - 自定义自动认证

java - 在 OS X Yosemite 10.10.4 中设置 JAVA_HOME