java showMessageDialog输入文本输入焦点

时间:2014-09-23 10:47:14

标签: java swing focus

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

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

我如何避免这种情况......

是否有更好的方法来检查扫描仪是否完全发送所有字符并启动数据库检查而不是使用输入按钮

OR

当对话框关闭时,当对话框显示并返回焦点时,文本框有一种方法可以使焦点松开焦点(用户按下输入/点击确定/点击一下' x&#39 )。

我已经设法使用hasFocus()将焦点返回到文本框,但由于我只有一个文本框和框架上的Jtable,我有点受限制。我尝试将setfocus设置为Jtable,然后将对话框显示为变通方法,然后重新聚焦到文本框,但问题仍然存在。甚至试图把焦点放在框架上,仍然没有运气。

请问任何想法?

3 个答案:

答案 0 :(得分:1)

以下是使用键绑定的示例:

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 关闭对话框,它将不会初始化扫描,除非您按下该键(持续时间取决于操作系统)。

答案 1 :(得分:0)

你的焦点想法是行不通的。但由于你没有发布任何代码,我所能提供的只是这个kludge。

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;
    }
  }
}

答案 2 :(得分:0)

经过一些测试后,我找到了另一种选择。

我用一个文本字段做了一个简单的应用程序。

以前我曾经:

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事件,关闭对话框,双手焦点回到文本字段,然后按住输入键几毫秒,文本框现在有焦点,因此当我抬起手指时,会触发KeyReleased事件。

也适用于扫描仪。

感谢所有的建议。