如何在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示例和实现文档筛选器以及侦听 文档 的更改
如果您的条形码扫描器将关键事件注入事件队列,您可能希望在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
来测试该字段。