我有一个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 Examples和 Implementing a Document Filter和 Listening 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/