как найти исходный компонент, который сгенерировал DocumentEvent - PullRequest
15 голосов
/ 07 марта 2011

Можно ли узнать, какой объект сгенерировал DocumentEvent? Что-то вроде того, что я могу сделать с ActionListener:

JTextField field = new JTextField("");
field.addActionListener(actionListener);

//inside ActionListener
public void actionPerformed(ActionEvent arg0) {
  if (arg0.getSource() instanceof JTextField) //true

}

Я хотел бы сделать то же самое с DocumentEvent, но, похоже, не работает так:

JTextField field = new JTextField("");
field.getDocument.addDocumentListener(documentListener);
//inside documentListener
public void insertUpdate(DocumentEvent){
  if (arg0.getSource() instanceof JTextField) //false: class is javax.swing.text.PlainDocument
  if (arg0.getSource() instanceof MyComponent){
      MyComponent comp = (MyComponent)arg0.getSource();
      comp.callSpecificMethodUponMyComp(); 
  }
}

Ответчик должен учитывать следующие моменты:

  1. Для моих целей недостаточно знать тип объекта, который сгенерировал событие, но мне нужна ссылка на него во время выполнения.
  2. Как правило, события генерируются из расширения объекта колебания (myComp public JTextField). Эти объекты хранят дополнительную информацию, которая должна быть получена во время выполнения внутри метода слушателя (например, insertUpdate)
  3. DocumentListener реализован из класса, который не знает полей, которые генерировали события. Дифференциальные поля разных типов могут быть присоединены к слушателю во время выполнения.

Ответы [ 2 ]

28 голосов
/ 07 марта 2011

Вы можете установить свойство в документе, чтобы указать, к какому текстовому компоненту относится документ:

Например:

final JTextField field = new JTextField("");
field.getDocument().putProperty("owner", field); //set the owner

final JTextField field2 = new JTextField("");
field2.getDocument().putProperty("owner", field2); //set the owner

DocumentListener documentListener = new DocumentListener() {

     public void changedUpdate(DocumentEvent documentEvent) {}

     public void insertUpdate(DocumentEvent documentEvent) {

         //get the owner of this document
         Object owner = documentEvent.getDocument().getProperty("owner");
         if(owner != null){
             //owner is the jtextfield
             System.out.println(owner);
         }
     }

     public void removeUpdate(DocumentEvent documentEvent) {}

     private void updateValue(DocumentEvent documentEvent) {}
};

field.getDocument().addDocumentListener(documentListener);
field2.getDocument().addDocumentListener(documentListener);

С другой стороны

Получите документ, который вызвал событие, и сравните его с документом текстового поля.

Пример:

public void insertUpdate(DocumentEvent documentEvent) {
    if (documentEvent.getDocument()== field.getDocument()){
        System.out.println("event caused by field");
    }
    else if (documentEvent.getDocument()== field2.getDocument()){
        System.out.println("event caused by field2");
    }
}
3 голосов
/ 09 марта 2011

Вместо добавления нескольких полей к одному и тому же слушателю. Создайте пользовательский слушатель, который при создании получает ссылку на текстовое поле. Затем создайте новый экземпляр слушателя каждый раз, когда вы добавляете его в поле.

...