是否有可能在jTextfield中键入一个值后,它将自动按下而不使用jButton?

时间:2017-03-18 13:02:42

标签: java swing netbeans jtextfield

在jTextfield中输入一个值后,它会自动按下而不使用jButton吗?我不知道它是否可能..在扫描后我的条码扫描器中使用它很好,并显示jTextfield将自动接收的值并在数据库上启动查询

3 个答案:

答案 0 :(得分:2)

答案取决于您对“按”的定义。根据我的经验,期望是,当扫描条形码时,将执行操作而无需用户做任何额外的事情

基于这个假设,您有两个基本选择

固定长度

如果您知道条形码的长度(并且它是常数),您可以使用DocumentFilter来检测何时达到长度并触发操作

public class BarCodeLengthDocumentListener implements DocumentListener {

    private ActionListener actionListener;
    private int barCodeLength;

    public BarCodeLengthDocumentListener(int barCodeLength, ActionListener actionListener) {
        this.actionListener = actionListener;
        this.barCodeLength = barCodeLength;
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        doCheck(e);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        doCheck(e);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        doCheck(e);
    }

    protected void doCheck(DocumentEvent e) {
        Document doc = e.getDocument();
        if (doc.getLength() >= barCodeLength) {
            try {
                String text = doc.getText(0, doc.getLength());
                ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text);
                actionListener.actionPerformed(evt);
            } catch (BadLocationException exp) {
                exp.printStackTrace();
                ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null);
                actionListener.actionPerformed(evt);
            }
        }
    }

}

所以,基本上,这允许您指定条形码的预期长度,当它到达时,它将触发ActionListener,将文本传递到ActionEvent

延迟行动

如果您不知道长度(或它的变量),另一个选择是在文档事件发生和触发ActionListener之间注入某种延迟

public class DelayedDocumentListener implements DocumentListener {

    private ActionListener actionListener;
    private String text;
    private Timer timer;

    public DelayedDocumentListener(ActionListener actionListener) {
        this.actionListener = actionListener;
        timer = new Timer(1000, new ActionListener() {
                                        @Override
                                        public void actionPerformed(ActionEvent e) {
                                            ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, text);
                                            actionListener.actionPerformed(evt);
                                        }
                                    });
        timer.setRepeats(false);
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        doCheck(e);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        doCheck(e);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        doCheck(e);
    }

    protected void doCheck(DocumentEvent e) {
        try {
            Document doc = e.getDocument();
            text = doc.getText(0, doc.getLength());
        } catch (BadLocationException ex) {
            ex.printStackTrace();
        }
        timer.restart();
    }

}

因此,这使用了一个Swing Timer,它在文档事件发生和触发ActionListener之间产生延迟(在这种情况下为1秒),每个新文档事件都会中断{ {1}},导致它重新启动。这意味着在最后一个文档事件和触发Timer之间必须至少有1秒。

因为有时人们需要手动输入条形码,您可能希望使用该延迟。

可运行的示例......

所以,这基本上都提出了两个想法,它使用ActionListener将键击注入键盘缓冲区,这应该模拟大多数条码扫描器

java.awt.Robot

答案 1 :(得分:1)

  

在jTextfield中键入一个值后,它是否可以在不使用jButton的情况下自动按下?

您可以在文本字段中添加ActionListener

当文本字段具有焦点并按下Enter键时,将调用侦听器。

答案 2 :(得分:-1)

初始化文本字段后添加KeyListener:

textfield.addKeyListener(new KeyListener() {

    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("typed: "+e.getKeyChar());
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("released: "+e.getKeyChar());
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("pressed: "+e.getKeyChar());
    }
});

并根据需要进行修改