繁体   English   中英

如何固定JTextField上的keylistener?

[英]How to fixed keylistener on JTextField?

我有一个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位数字,但是如果条形码阅读器不是很快,键侦听器只能处理4位,5位或6位数字,这是一个问题。

我该如何解决?

简短的答案是不。 如果您想知道字段内容何时更改,请使用DocumentFilter更改输入到JTextComponentDocumentListener的内容。

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

有关更多详细信息,请参见DocumentFilter示例实现文档过滤器以及侦听 文档 中的更改。

如果您的条形码扫描仪正在将按键事件注入事件队列,则您可能希望在DocumentFilter注入一个人为的延迟,因为在输入所有按键之后,才需要处理该字段。

例如...

基本上,此方法使用的Swing Timer设置为短延迟(在这种情况下为250毫秒),每次字段更新(并通知DocumentListener )时,它将重新启动Timer 这意味着自上一次更新起,必须至少有250毫秒的延迟,然后Timer才能触发已注册的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来测试该字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM