【问题标题】:java showMessageDialog enter text input focusjava showMessageDialog 输入文本输入焦点
【发布时间】:2014-09-23 10:47:13
【问题描述】:

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

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

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

有没有比使用回车键更好的方法来检查扫描仪是否完全发送了它的所有字符并启动数据库检查

有没有办法让文本框在对话框显示时暂时松开焦点,并在对话框关闭时将焦点返回给它(用户按下回车键/单击确定/单击小“x”)。

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

有什么想法吗?

【问题讨论】:

  • 如果您展示您的一段代码,我们可以自己运行并看到问题,这将立即解决 (MCVE)。

标签: java swing focus


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

【讨论】:

    【解决方案2】:

    经过更多测试后,我找到了替代方案。

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

    以前我有:

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

    这解决了问题。不再循环。

    我假设在 Keydown 事件上按下对话框上的 OK 按钮,这会关闭对话框,将焦点移回文本字段,然后在我按住 enter 键的几毫秒内,文本框现在具有焦点,因此当我抬起手指时触发 KeyReleased 事件。

    也适用于扫描仪。

    感谢所有建议。

    【讨论】:

    • 直接处理关键事件是有风险的(一方面,它取决于操作系统)。考虑将您的解决方案转换为使用我在回答中演示的键绑定。
    • @user1803551...感谢您的意见。我对 Java 还是很陌生。就像一个星期一样。所以我的脚还是湿的
    【解决方案3】:

    你的专注点子行不通。但既然你还没有发布任何代码,我能提供的就是这个杂牌。

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

    【讨论】:

    • ENTER 向 JOptionPane 触发事件(KeyBindings),KeyListener 的原因是什么(例如,标准 JOptionPane 中的输入字段是 JTextFiels,JComboBox 都讨厌 KeyListener)
    猜你喜欢
    • 2021-10-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    相关资源
    最近更新 更多