我正在编写一个使用条码扫描器作为输入的小应用程序。经过一些测试,我决定使用evt. getKeyCode()==KeyEvent。VK_ENTER向DB发出检查。因此,用户可以在文本框中手动输入条形码,然后按回车键发出DB检查,或者使用扫描仪,一旦发送了所有扫描字符,扫描仪也会自动发送回车键。
如果扫描的条形码有问题,我使用JOptionPane. showMessageDialog向用户显示错误消息。当用户按下回车键以关闭对话框时,它会再次触发对话框,就好像文本字段上再次按下了回车键一样…它会进入这个循环,直到用户用鼠标单击确定按钮。
我怎么避免这个…
有没有更好的方法来检查扫描仪是否完全发送所有字符并开始DB检查,而不是使用回车键
或
当对话框显示并在对话框关闭时(用户按回车键/单击OK/单击小'x')将焦点返回给它时,输入框是否有办法松散焦点。
我已经设法使用hasFocus()将焦点返回到输入框,但是因为我只有一个输入框和框架上的Jtable,所以我有点受限。我试图在将对话框显示为变通方法之前将焦点设置为Jtable,然后重新聚焦到文本框,但问题仍然存在。即使尝试将焦点设置为框架,仍然没有运气。
有什么想法吗?
这是一个使用键绑定的示例:
public class EnterKey extends JFrame {
EnterKey() {
JPanel base = new JPanel();
base.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "Scan!");
base.getActionMap().put("Scan!", new ScanAction());
base.getInputMap().put(KeyStroke.getKeyStroke("A"), "Simulate error");
base.getActionMap().put("Simulate error", new ErrorAction());
add(base);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
new EnterKey();
}
private class ScanAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
//perform scan
System.out.println("Scan performed");
}
}
private class ErrorAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
//open error dialog
JOptionPane.showMessageDialog(EnterKey.this, "Error", "Bad scan", JOptionPane.ERROR_MESSAGE);
}
}
}
该框架仅包含一个接收键事件的空面板。按Enter启动扫描或按a弹出一个错误对话框。如果您使用Enter关闭对话框,它将不会初始化扫描,除非您一直按下键(持续时间取决于OS)。
经过更多的测试,我找到了另一种选择。
我做了一个简单的应用程序,只有一个文本字段。
以前我有:
private void jTextField1KeyReleased(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
JOptionPane.showMessageDialog(null, "Enter button pressed");
}
}
如果使用输入按钮关闭对话框,这将导致对话框显示和关闭的循环。
我将此更改为:
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
JOptionPane.showMessageDialog(null, "Enter button pressed");
}
}
这解决了问题。没有更多的循环。
我假设对话框上的OK按钮在Keydown事件上被按下,该事件关闭对话框,将焦点移回文本字段,然后在我按住回车键的几毫秒内,输入框现在具有焦点,因此在我抬起手指时触发KeyReleed事件。
也适用于扫描仪。
谢谢你所有的建议。
你专注的想法行不通。但是既然你没有发布任何代码,我只能提供这个杂七杂八的东西。
public static class MyKeyListener extends KeyAdapter {
private changed = false;
public void keyPressed (KeyEvent ke) {
if (ke.getKeyCode() == VK.ENTER) {
if (changed) runIt(); // submit to db
} else {
changed = true;
}
}
}