提问者:小点点

javashowMessageDialog输入文本输入焦点


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

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

我怎么避免这个…

有没有更好的方法来检查扫描仪是否完全发送所有字符并开始DB检查,而不是使用回车键

当对话框显示并在对话框关闭时(用户按回车键/单击OK/单击小'x')将焦点返回给它时,输入框是否有办法松散焦点。

我已经设法使用hasFocus()将焦点返回到输入框,但是因为我只有一个输入框和框架上的Jtable,所以我有点受限。我试图在将对话框显示为变通方法之前将焦点设置为Jtable,然后重新聚焦到文本框,但问题仍然存在。即使尝试将焦点设置为框架,仍然没有运气。

有什么想法吗?


共3个答案

匿名用户

这是一个使用键绑定的示例:

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