AddKeyListener через лямбда-функцию - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь добавить KeyListener KeyTyped к моему JTextField с помощью лямбда-функции, как я делал с моими слушателями действий:

cmp_btn.addActionListener(e -> actionPerformed(e));
private void actionPerformed(ActionEvent e)
{
  // Do something ...
}

Если я пытаюсь сделать это с addKeyListener(e -> keyPerformed(e));, я получаю ошибку "lambda параметр предоставил «но» обязательный тип: KeyEvent »взамен.

Функция аналогична показанной выше, но с KeyEvent e в качестве параметра.

// РЕДАКТИРОВАНИЕ 1: Я только что увидел, что addKeyListener требует KeyAdapter. Поскольку KeyAdapter является абстрактным классом, мне нужно создать экземпляр KeyAdapter, чтобы он заработал, но если я это сделаю, то у меня снова будет встроенная функция (которую я не хочу из-за повторного использования функции). Есть ли способ извлечь определенные функции из встроенного блока?

// РЕДАКТИРОВАНИЕ 2: Возможное (безобразное) решение проблемы:

cmp_textfield.addKeyListener(new KeyAdapter() {
  @Override
  public void keyTyped(KeyEvent e)
  {
    super.keyTyped(e);
    My_KeyTyped_Method(e);
  }
});

Есть ли лучший способ?

1 Ответ

3 голосов
/ 24 апреля 2020

На самом деле, addKeyListener принимает KeyListener в качестве параметра. KeyAdapter с другой стороны, созданной по той причине, что вы создали этот вопрос. Для простоты". Взгляните на KeyAdapter:

public abstract class KeyAdapter implements KeyListener {
    public void keyTyped(KeyEvent e) {}

    public void keyPressed(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
}

Он реализует KeyListener и позволяет вам переопределить - нацелить метод, который вам нужен. Добавление KeyListener с лямбдами невозможно, поскольку лямбды можно использовать только для @FunctionalInterface с. @FunctionalInterface - это интерфейс, который имеет только один не default метод. KeyListener интерфейс не один, так как имеет 3 метода.

Вы ничего не можете с этим поделать. Один из способов - создать @FunctinalInterface s, расширив интерфейс KeyListener и сделав "неактуальные" для вас методы default:

Пример:

@FunctionalInterface //Not required, just a convention
public interface KeyRealeasedListener extends KeyListener {

    @Override
    default void keyPressed(KeyEvent e) {
    }

    @Override
    default void keyTyped(KeyEvent e) {
    }
}

Уведомление что keyReleased не реализовано. И добавить его в компонент:

component.addKeyListener((KeyRealeasedListener) e -> System.out.println("key released"));
...