【问题标题】:How to cast getSource() to be a JTextField?如何将 getSource() 转换为 JTextField?
【发布时间】:2014-04-11 16:40:14
【问题描述】:

我正在创建一个KeyListener 类,这样我就可以控制我想要的任何JTextField,但我不知道如何获取我调用的任何JTextField 以便我可以按escape 并清除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

    }
}

【问题讨论】:

    标签: java swing jtextfield keylistener


    【解决方案1】:

    在我看来,您正在尝试创建一个只允许整数值的文本字段。首先,您不应该将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 了解 OP 尝试做什么,以及更好的解决方案:)
    • @nachokk 我刚刚看到IntegerTxtListener 并做了一个假设。谁知道我可能错了。
    • @user3502019 那么你应该接受这个答案是正确的(带有绿色标记)而不是你接受的那个。猜测
    【解决方案2】:

    我不知道您要达到什么目的,但如果要控制用户输入,请考虑改用 DocumentFilter

    如果您仍想使用KeyListener,只需将e.getSource() 转换为JTextField,以确保没有ClassCastException,您应该使用instanceof 运算符,如下例所示。

    if(evt.getSource() instanceof JTextField){
       JTextField textfield = (JTextField) e.getSource();
       textfield.setText("..");
       e.consume();
    }
    

    考虑扩展KeyAdapter,而不是实现KeyListener

    【讨论】:

      【解决方案3】:

      我认为这应该可行:

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

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

      但是如果e 不是JTextField 的实例,可能会发生一些错误。
      因此,如果您确定您的 Listener 不会提供 JTextField 对象以外的来源,您可以采用这种方式。否则,您添加错误处理/-prevention。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多