1

I have one text field on JPanel, and there is one Document Listener on this text field. As document listener contains three method(removeUpdate,insertUpdate,changeUpdate) so how can I call particular method using Lambda Expression.

    field.getDocument().addDocumentListener(new DocumentListener() {

        @Override
        public void removeUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
            button.setText(field.getText());
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {


        }

    });

How Can I call this Document listener insertUpdate method using Lambda expression like field.getDocument().addDocumentListener(lambda expression);

Naveen Kumar
  • 420
  • 4
  • 16

1 Answers1

4

TL;DR: You cannot. DocumentListener is not a Single Method Interface

In order for a lambda to serve as an instance of a particular interface that interface must have a single abstract method.

DocumentListener has 3 abstract methods, so you would need to create an SMI that extends DocumentListener:

interface InsertListener extends DocumentListener {
    @Override
    default void removeUpdate(DocumentEvent e) {
    }

    @Override
    default void changedUpdate(DocumentEvent e) {
    }
}

And now you can create an instance of InsertListener using a lambda expression:

final InsertListener is = e -> button.setText(field.getText());

And you can pass this into a method:

field.getDocument().addDocumentListener(is);

You could also, for example, create an interface something like:

interface InsertListener extends DocumentListener {

    void onEvent(DocumentEvent.EventType type, DocumentEvent e);

    @Override
    default void insertUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void removeUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void changedUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }
}

And now you can process any of the events by type:

final InsertListener is = (t, e) -> {
    if (t == DocumentEvent.EventType.INSERT) {
        button.setText(field.getText());
    }
};

This is slightly more compact than an anonymous class, but not by much.

Boris the Spider
  • 59,842
  • 6
  • 106
  • 166