【问题标题】:How to get source object from DocumentListener (DocumentEvent)? [duplicate]如何从 DocumentListener (DocumentEvent) 获取源对象? [复制]
【发布时间】:2013-05-13 15:20:41
【问题描述】:

我有我的课,我已经实现了DocumentListener

public void removeUpdate( DocumentEvent arg0 ) {
   System.out.println( arg0.getDocument());
}

它将打印javax.swing.text.PlainDocument@49ea903c

有什么方法可以获取对象,以便获取更改后的文本字段的值?目前我只有一个字段,所以我不需要检查,但如果我使用两个或更多,我怎么知道哪个JTextField 通知了侦听器?

【问题讨论】:

    标签: java swing documentlistener


    【解决方案1】:

    我不确定是否可以从 Document 中获取 swing 组件。但是问题很容易解决:只需为每个文本字段添加不同的侦听器实例,并将文本字段存储在侦听器本身中。

    textField1.getDocument().addDocumentListener(new MyDocumentListener(textField1));
    textField2.getDocument().addDocumentListener(new MyDocumentListener(textField2));
    textField3.getDocument().addDocumentListener(new MyDocumentListener(textField3));
    

    【讨论】:

    • 是的,我知道这一点,我希望我可以让我的代码更干净,就像你可以在 ActionListener 上使用 event.getSource() 一样。谢谢你的回答。
    • 找到任何不错的替代品了吗?
    【解决方案2】:

    一种选择是使用内部类,这将为您提供引用文本字段的机会。

    final JTextField field = new JTextField();
    
    field.getDocument().addDocumentListener(new DocumentListener() {
      // Here you can reference 'field' in your methods
    });
    

    如果您需要对每个文本字段执行相同的操作,JB Nizet's solution 会更整洁。

    【讨论】:

      【解决方案3】:

      你实际上得到了PlainDocument 对象。只需将其存储在变量中而不是打印它。

      欲了解更多信息,请参阅docs

      【讨论】:

        【解决方案4】:

        您需要做的是将文档列表器添加到您需要的每个组件中。如果您真的需要知道哪些文本字段文本已更改,那么您可以在 DocumentListner 中拥有一个属性作为 textFieldName 或其他内容,您可以在您使用时设置它为他们创建文档监听器。但我认为你最好改变你对情况的处理方式。这听起来不太好。

        【讨论】:

          【解决方案5】:

          您可以在不知道上下文的情况下更新文档。

          查阅javax.swing.event.DocumentEvent的文档

          这些方法与javax.swing.event.DocumentEvent.getDocument() 检索到的文档相结合,可以让您以适当的方式更新文档。稍后您可以添加其他文本字段而不做任何更改。

          在更改后简单地获取 JTextField 的文本:

          JTextField myTf = new ...; // maybe an attribute definition
          ...
          myTf.addActionListener(
             new ActionListener(){@Override public void actionPerformed( ActionEvent e ) {
                JTextField tf = (JTextField)e.getSource();
                System.out.println( tf.getText());
                if( tf == myTf ) { // == for reference comparison
                   ... // do something dedicated to myTf
                }
             }});
          

          【讨论】:

          • 在我在这里提出我的问题之前,我已经多次阅读了文档,但我看不到 getOffset() 或 getLenght() 对我有什么帮助。我想在更改后获取字段中的文本,而不是长度,因为我将根据它进行搜索
          • DocumentListener 用于更复杂的操作,请参阅我的编辑
          猜你喜欢
          • 2011-01-18
          • 2015-10-26
          • 1970-01-01
          • 1970-01-01
          • 2012-09-17
          • 2018-06-09
          • 1970-01-01
          • 1970-01-01
          • 2012-06-10
          相关资源
          最近更新 更多