java - 如何修复 JTextField 上的按键监听器?

标签 java swing barcode keylistener

我有一个Java swing应用程序,所以我有一个带有KeyListener的简单文本框,并且我有一个条形码阅读器(USB),当条形码阅读器在这个文本框中写入数字时,我检查代码并处理它。但我有一个问题,代码可以有 4 到 13 位数字。所以我有这个代码

public class KeyListenerCodice implements KeyListener{
    public void keyPressed(KeyEvent click) {

    }

    public void keyReleased(KeyEvent keyEvent) {
        printIt("Released", keyEvent);
    }

    public void keyTyped(KeyEvent keyEvent) {
        printIt("Typed", keyEvent);
    }

    private void printIt(String title, KeyEvent keyEvent) {
        if(textCodice.getText().length()>=4 && textCodice.getText().length()<=13)
        {
            if(mappaArticoliScontrini.get(textCodice.getText().toUpperCase())!=null){
                inserisciProdotto();
            }
        }
    }
}

但有时代码有 13 位数字,但如果条形码读取器速度不是很快,则 key 监听器只能处理 4、5 或 6 位数字,这是一个问题。

如何修复它?

最佳答案

简短的回答是不。使用DocumentFilter更改 JTextComponent 中输入的内容或DocumentListener如果您想知道字段内容何时发生变化。

KeyListener不会考虑用户将文本粘贴到字段中或以编程方式修改字段时会发生什么

参见DocumentFilter ExamplesImplementing a Document FilterListening for Changes on a Document了解更多详情

如果您的条形码扫描仪将关键事件注入(inject)事件队列,您可能希望将人为延迟注入(inject) DocumentFilter ,因为在输入所有按键之前,您不想处理该字段。

例如...

这基本上使用了 Swing Timer设置为短延迟(在本例中为 250 毫秒),每次更新该字段(并且通知 DocumentListener),它都会重新启动 Timer 。这意味着 Timer 之前距上次更新必须至少有 250 毫秒的延迟。可以触发注册ActionListener并更新标签。

public class TestPane extends JPanel {

    private Timer updateTimer;
    private JTextField field;
    private JLabel label;

    public TestPane() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;

        updateTimer = new Timer(250, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText(field.getText());
            }
        });
        updateTimer.setRepeats(false);

        label = new JLabel("...");
        field = new JTextField(14);
        field.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void insertUpdate(DocumentEvent e) {
                processUpdate();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                processUpdate();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                processUpdate();
            }

        });

        add(field, gbc);
        add(label, gbc);
    }

    protected void processUpdate() {
        updateTimer.restart();
    }

}

您可能想尝试一下延迟。

条形码扫描仪也可能会将 Enter 键插入到事件队列中,因此可能值得通过注册 ActionListener 来测试该字段。反对它

关于java - 如何修复 JTextField 上的按键监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29644309/

相关文章:

java - Rest Controller 无法识别 Spring Boot App 中的 GET 请求

java - JPanel 布局未按预期呈现

c# - 如何使用 ReportViewer Local Report VS 2008 创建条形码?

java - 从 JSP/Servlet/Portlets(Jetspeed) 迁移到 Spring 项目 - 应用程序设计

java - 如何使 recyclerview 根据百分比仅显示一个数组?

java - 如何在ConfirmDialog 中更改焦点?

java - 为什么我不能用 fillPolygon() 绘制矩形

zend-framework - Zend Framework 将条形码渲染为 PDF 页面

javascript - 在 Adob​​e Acrobat XI 中使用 JavaScript 修改 PDF 字段值

java - 减少java中的文件缓存