如何在JTextField上修复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位数,但如果条形码阅读器不是很快,则keylistener只处理4或5或6位数,这是一个问题.

我该如何修理它?

解决方法:

简短的回答是不.如果要知道字段内容何时更改,请使用DocumentFilter更改输入到JTextComponent或DocumentListener中的内容.

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

有关详细信息,请参见DocumentFilter ExamplesImplementing a Document FilterListening for Changes on a Document

如果条形码扫描器将关键事件注入事件队列,您可能希望在DocumentFilter中注入一个人工延迟,因为在输入所有击键之后您将不想处理该字段.

例如…

这基本上使用Swing Timer设置为短延迟(在这种情况下为250毫秒),每次更新字段(并通知DocumentListener)时,它会重新启动Timer.这意味着在Timer可以触发已注册的ActionListener并更新标签之前,必须至少比上次更新延迟250毫秒.

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来测试该字段

上一篇:Django事务用法


下一篇:使用ZXing创建Android条形码扫描应用程序