Добавление пользовательского метода в качестве ключевого слушателя к компоненту - PullRequest
0 голосов
/ 10 января 2020

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

Для слушателя действия это делается так же просто, как определение private void с этой подписью:

private void myButtonActionListener(ActionEvent e)

и назначением ее кнопке с помощью оператора ссылки на метод:

myButton.addActionListener(this::myButtonActionListener);

однако, похоже, что он не работает для ключевые слушатели . Я определил метод следующим образом:

private void myTextBoxKeyPressed(KeyEvent event)

, но эта строка кода вызывает ошибку, говорящую, что « это не функциональный интерфейс »:

myTextBox.addKeyListener(this::myTextBoxKeyPressed);

любой идеи, как решить эту проблему, в отличие от слушателя действия, ключевой слушатель имеет более одного метода для реализации.

Мне хорошо известны другие подходы, такие как реализация класса слушателя или использование анонимного внутреннего класса, но я предпочитаю найти новый способ сохранить мой код чище.

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я не думаю, что это возможно. Java достаточно умен, чтобы иметь возможность обрабатывать функцию myButtonActionListener с помощью соответствующего объявления, как если бы вы реализовали анонимный класс, реализующий требуемый интерфейс ActionListener . Это единственная причина, по которой myButtonActionListener можно использовать, как вы описали, потому что ActionListener требует от вас реализации только одной функции и ничего больше.

Однако KeyListener требует три (!) функций для реализации. Java не может понять, какую из этих трех функций вы пытаетесь «реализовать», потому что их объявление одно и то же, и даже если бы оно имело место, вы все равно не реализовали две другие, что по замыслу недопустимо, потому что Вы не можете сказать, использует ли функция, использующая ваш KeyListener. Вы не сможете обойти это. Если требуется реализация интерфейса, то это то, что вам нужно предоставить.

Чтобы сделать его немного чище, вы можете создать встроенный объект, реализующий желаемый интерфейс. Вот пример использования интерфейса Runnable:

Runnable r = new Runnable() {    
    @Override
    public void run() {
        // do something
    }
};
0 голосов
/ 10 января 2020

Вы должны использовать AbstractAction и либо JComponent.setAction, либо Jcomponent.getActionMap ()

public MyAction extends AbstractAction {
  public void actionPerformed(ActionEvent ae) {
  //...
  }
}
...