java ShowMessage对话框输入文本输入焦点

java ShowMessage对话框输入文本输入焦点,java,swing,focus,Java,Swing,Focus,我正在编写一个使用条形码扫描仪作为输入的小应用程序。 在一些测试之后,我决定使用evt.getKeyCode()==KeyEvent.VK_ENTER对数据库进行检查。 因此,用户可以在文本框中手动输入条形码,然后按enter键启动DB检查,或者使用扫描仪,在发送所有扫描字符后,扫描仪也会自动发送enter字符 如果扫描的条形码有问题,我会使用JOptionPane.showMessageDialog向用户显示错误消息。当用户按下enter按钮关闭对话框时,它会再次触发对话框,就像文本字段上再次

我正在编写一个使用条形码扫描仪作为输入的小应用程序。 在一些测试之后,我决定使用evt.getKeyCode()==KeyEvent.VK_ENTER对数据库进行检查。 因此,用户可以在文本框中手动输入条形码,然后按enter键启动DB检查,或者使用扫描仪,在发送所有扫描字符后,扫描仪也会自动发送enter字符

如果扫描的条形码有问题,我会使用JOptionPane.showMessageDialog向用户显示错误消息。当用户按下enter按钮关闭对话框时,它会再次触发对话框,就像文本字段上再次按下enter按钮一样。。它进入这个循环,直到用户用鼠标单击OK按钮

我如何避免这个

有没有比使用enter按钮更好的方法来检查扫描仪是否完全发送所有字符并启动DB检查

是否有一种方法可以让文本框在显示对话框时暂时失去焦点,并在对话框关闭时将焦点返回到文本框(用户按enter键/单击OK键/单击小“x”)

我已经设法使用hasFocus()将焦点返回到文本框,但是由于我只有一个文本框和框架上的Jtable,所以我有点受限。在将对话框显示为解决方法之前,我尝试将焦点设置为Jtable,然后将焦点重新设置为textbox,但问题仍然存在。即使试着把焦点放在画面上,还是没有运气


有什么想法吗?

你的专注想法行不通。但既然你还没有发布任何代码,我能提供的就是这些乱七八糟的东西

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还是很陌生。大概一周前吧。所以我的脚还是湿的