在jTextfield中输入一个值后,它会自动按下而不使用jButton吗?我不知道它是否可能..在扫描后我的条码扫描器中使用它很好,并显示jTextfield将自动接收的值并在数据库上启动查询
答案 0 :(得分:2)
答案取决于您对“按”的定义。根据我的经验,期望是,当扫描条形码时,将执行操作而无需用户做任何额外的事情
基于这个假设,您有两个基本选择
如果您知道条形码的长度(并且它是常数),您可以使用DocumentFilter
来检测何时达到长度并触发操作
public class BarCodeLengthDocumentListener implements DocumentListener {
private ActionListener actionListener;
private int barCodeLength;
public BarCodeLengthDocumentListener(int barCodeLength, ActionListener actionListener) {
this.actionListener = actionListener;
this.barCodeLength = barCodeLength;
}
@Override
public void insertUpdate(DocumentEvent e) {
doCheck(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
doCheck(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
doCheck(e);
}
protected void doCheck(DocumentEvent e) {
Document doc = e.getDocument();
if (doc.getLength() >= barCodeLength) {
try {
String text = doc.getText(0, doc.getLength());
ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text);
actionListener.actionPerformed(evt);
} catch (BadLocationException exp) {
exp.printStackTrace();
ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null);
actionListener.actionPerformed(evt);
}
}
}
}
所以,基本上,这允许您指定条形码的预期长度,当它到达时,它将触发ActionListener
,将文本传递到ActionEvent
如果您不知道长度(或它的变量),另一个选择是在文档事件发生和触发ActionListener
之间注入某种延迟
public class DelayedDocumentListener implements DocumentListener {
private ActionListener actionListener;
private String text;
private Timer timer;
public DelayedDocumentListener(ActionListener actionListener) {
this.actionListener = actionListener;
timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text);
actionListener.actionPerformed(evt);
}
});
timer.setRepeats(false);
}
@Override
public void insertUpdate(DocumentEvent e) {
doCheck(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
doCheck(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
doCheck(e);
}
protected void doCheck(DocumentEvent e) {
try {
Document doc = e.getDocument();
text = doc.getText(0, doc.getLength());
} catch (BadLocationException ex) {
ex.printStackTrace();
}
timer.restart();
}
}
因此,这使用了一个Swing Timer
,它在文档事件发生和触发ActionListener
之间产生延迟(在这种情况下为1秒),每个新文档事件都会中断{ {1}},导致它重新启动。这意味着在最后一个文档事件和触发Timer
之间必须至少有1秒。
因为有时人们需要手动输入条形码,您可能希望使用该延迟。
所以,这基本上都提出了两个想法,它使用ActionListener
将键击注入键盘缓冲区,这应该模拟大多数条码扫描器
java.awt.Robot
答案 1 :(得分:1)
在jTextfield中键入一个值后,它是否可以在不使用jButton的情况下自动按下?
您可以在文本字段中添加ActionListener
。
当文本字段具有焦点并按下Enter键时,将调用侦听器。
答案 2 :(得分:-1)
初始化文本字段后添加KeyListener:
textfield.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("typed: "+e.getKeyChar());
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("released: "+e.getKeyChar());
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("pressed: "+e.getKeyChar());
}
});
并根据需要进行修改