如何将getSource()转换为JTextField?

时间:2014-04-11 16:40:15

标签: java swing jtextfield keylistener

我正在制作一个KeyListener课程,所以我可以控制我想要的任何JTextField,但我不知道如何得到JTextField我打电话给我,所以我可以按下逃避和清除JTextField?这是我目前的代码

private class IntegerTxtListener implements KeyListener {
    public void keyTyped(final KeyEvent e) {
            if (e.getKeyChar() < KeyEvent.VK_0
                    || e.getKeyChar() > KeyEvent.VK_9) {
                e.consume();
            }
        if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
            e.consume();
           //My Problem is Here----------------------------
            e.getSource()).setText("");
        }
    }

    @Override
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
}

3 个答案:

答案 0 :(得分:2)

对我来说,您试图创建一个只允许整数值的文本字段。首先,您不应该使用KeyListener作为JTextField。相反,您应该使用DocumentFilter作为JTextField的基础文档。 DocumentFilter可以过滤掉任何不需要的输入。

以下是仅允许整数输入的JTextField示例。

private JTextField createTextField() {
    JTextField field = new JTextField();
    ((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentFilter() {
        @Override
        public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
                throws BadLocationException {
            fb.insertString(off, str.replaceAll("\\D++", ""), attr);  // remove non-digits
        }

        @Override
        public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
                throws BadLocationException {
            fb.replace(off, len, str.replaceAll("\\D++", ""), attr);  // remove non-digits
        }
    });
    return field;
} 

此外,可能不相关,但您可能想要查看另一个监听器,处理文本输入是DocumentListener,它将监听文本字段的基础文档中的更改。您可以在How to write DocumentListeners

了解更多信息

答案 1 :(得分:1)

我不知道您想要实现的目标,但如果要控制用户输入,请考虑使用DocumentFilter

如果您仍想使用KeyListenere.getSource() JTextField ClassCastException,请确保instanceof不要使用if(evt.getSource() instanceof JTextField){ JTextField textfield = (JTextField) e.getSource(); textfield.setText(".."); e.consume(); } KeyAdapter运算符如下例所示。

KeyListener

考虑扩展{{1}}而不是实施{{1}}。

答案 2 :(得分:0)

我认为这可行:

if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
    e.consume();
   //My Problem is Here----------------------------
    ((JTextField)e.getSource()).setText("");
}

只是投射对象的默认方式。

如果e不是JTextField的实例,可能会发生一些错误。
因此,如果您确定您的监听器不会提供除JTextField对象之外的源,您可以这样做。否则你添加错误处理/预防。