java ShowMessage对话框输入文本输入焦点
我正在编写一个使用条形码扫描仪作为输入的小应用程序。 在一些测试之后,我决定使用evt.getKeyCode()==KeyEvent.VK_ENTER对数据库进行检查。 因此,用户可以在文本框中手动输入条形码,然后按enter键启动DB检查,或者使用扫描仪,在发送所有扫描字符后,扫描仪也会自动发送enter字符 如果扫描的条形码有问题,我会使用JOptionPane.showMessageDialog向用户显示错误消息。当用户按下enter按钮关闭对话框时,它会再次触发对话框,就像文本字段上再次按下enter按钮一样。。它进入这个循环,直到用户用鼠标单击OK按钮 我如何避免这个 有没有比使用enter按钮更好的方法来检查扫描仪是否完全发送所有字符并启动DB检查 或 是否有一种方法可以让文本框在显示对话框时暂时失去焦点,并在对话框关闭时将焦点返回到文本框(用户按enter键/单击OK键/单击小“x”) 我已经设法使用hasFocus()将焦点返回到文本框,但是由于我只有一个文本框和框架上的Jtable,所以我有点受限。在将对话框显示为解决方法之前,我尝试将焦点设置为Jtable,然后将焦点重新设置为textbox,但问题仍然存在。即使试着把焦点放在画面上,还是没有运气java ShowMessage对话框输入文本输入焦点,java,swing,focus,Java,Swing,Focus,我正在编写一个使用条形码扫描仪作为输入的小应用程序。 在一些测试之后,我决定使用evt.getKeyCode()==KeyEvent.VK_ENTER对数据库进行检查。 因此,用户可以在文本框中手动输入条形码,然后按enter键启动DB检查,或者使用扫描仪,在发送所有扫描字符后,扫描仪也会自动发送enter字符 如果扫描的条形码有问题,我会使用JOptionPane.showMessageDialog向用户显示错误消息。当用户按下enter按钮关闭对话框时,它会再次触发对话框,就像文本字段上再次
有什么想法吗?你的专注想法行不通。但既然你还没有发布任何代码,我能提供的就是这些乱七八糟的东西
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;
}
}
}
下面是一个使用键绑定的示例:
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键关闭对话框,则除非您一直按下该键,否则不会初始化扫描(持续时间取决于操作系统)。在进行更多测试后,我找到了另一种选择 我做了一个简单的应用程序,只有一个文本字段 以前我有:
private void jTextField1KeyReleased(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
JOptionPane.showMessageDialog(null, "Enter button pressed");
}
}
如果使用enter按钮关闭对话框,这将导致显示和关闭对话框的循环
我将此更改为:
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
JOptionPane.showMessageDialog(null, "Enter button pressed");
}
}
这就解决了问题。不再循环
我假设在Keydown事件中按下对话框上的OK按钮,关闭对话框,将焦点移回文本字段,然后在我按住enter键的几毫秒内,文本框现在有焦点,因此在我抬起手指时触发KeyReleased事件
也适用于扫描仪
感谢所有的建议。输入向JOptionPane触发事件(KeyBindings),KeyListener的原因是什么(例如,标准JOptionPane中的输入字段是JTextFiels,JComboBox都讨厌KeyListener),如果您显示您的代码片段,我们可以自己运行,并看到问题,这将很快得到解决().直接处理关键事件是有风险的(首先,它依赖于操作系统)。考虑将您的解决方案转换为使用密钥绑定,如我在答案中所示。@ USE1803551…谢谢你的意见。我对Java还是很陌生。大概一周前吧。所以我的脚还是湿的