Гарантирован ли порядок, в котором будут называться KeyListeners? - PullRequest
2 голосов
/ 11 марта 2011

Я могу упустить что-то очевидное в документации для addKeyListener , removeKeyListener , getKeyListeners или связанных с ними руководств, но есть ли какие-либо гарантии относительно заказа в каких добавленных ключевых слушателях запускаются? Я надеюсь, что они выполняются в том порядке, в котором они были добавлены, но я не вижу, чтобы это было указано где-либо.

Ситуация, с которой я столкнулся, заключается в том, что мне нужно добавить прослушиватель ключей к существующему Component и переопределить существующие прослушиватели ключей для определенных ключей. Похоже, что это можно сделать следующим образом:

  • Использование getKeyListeners для поиска всех существующих списков ключей.
  • Удалите каждого существующего ключевого слушателя с помощью removeKeyListener
  • Используйте addKeyListener, чтобы добавить мой ключевой слушатель. (Это касается только выбранных нажатий клавиш и использует событие, когда это происходит.)
  • Наконец, добавьте обратно всех ключевых слушателей, которые были найдены на первом шаге, с помощью addKeyListener.

Однако я не хочу этого делать, если выяснится, что это не будет работать на определенных JVM и т. Д.

Ответы [ 4 ]

4 голосов
/ 11 марта 2011

Я не совсем понимаю вашу ситуацию.Полагаться на порядок, в котором вызываются слушатели, кажется мне немного изворотливым.

Можете ли вы не просто создать класс-оболочку ключевого слушателя, который определяет, когда происходит ваше событие, и, если это уместно, делегирует событие обернутомукласс (ы) слушателя?

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

1 голос
/ 11 марта 2011

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

Нет, порядок не гарантируется.

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

Ознакомьтесь с классом EventListenerList, который, как мне кажется, является классом, используемым для реализации этой функциональности.

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

1 голос
/ 11 марта 2011

После прочтения документов кажется, что есть гарантия, что KeyEvent s будет поставлен в очередь и будет обрабатываться последовательно.Но это ничего не говорит о KeyListener с.Для меня это означает, что не будет никакой гарантии такого рода, поскольку каждый слушатель работает как отдельный поток.

Итак, я бы проголосовал за Филл здесь. Предложение Мата тоже подойдет.

1 голос
/ 11 марта 2011

Я не знаю, гарантирован ли заказ или нет.

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

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

void keyPressed(event) {
  // do some magic
  for (listener: savedListeners)
    listener.keyPressed(event);
}
...