Открытие рамочной рамки с клавишей F1 [дубликат]

Люди утверждают, что нельзя удалить из коллекции, которая повторяется в цикле foreach. Я просто хотел указать, что это технически неверно и точно описывает (я знаю, что вопрос OP настолько продвинут, чтобы избежать этого, чтобы понять это) код, лежащий в основе этого предположения:

    for (TouchableObj obj : untouchedSet) {  // <--- This is where ConcurrentModificationException strikes
        if (obj.isTouched()) {
            untouchedSet.remove(obj);
            touchedSt.add(obj);
            break;  // this is key to avoiding returning to the foreach
        }
    }

Не исключено, что вы не сможете удалить из итерированного Colletion, а затем продолжить, после чего продолжить. Следовательно, break в коде выше.

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

10
задан mikera 8 March 2013 в 11:19
поделиться

2 ответа

, когда вы предпочитаете один, а не другой?

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

Эта страница для привязок клавиш охватывает множество причин, по которым я хотел бы использовать их, а не KeyListener. В нем перечислены многие вещи, которые просто «недоступны» для KeyListener. НАПРИМЕР. выбор:

  • WHEN_FOCUSED
  • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • WHEN_IN_FOCUSED_WINDOW

Чем больше я прочитайте связанный документ, тем меньше я могу понять необходимость задать вопрос. E.G.:

Альтернативой привязке клавиш является использование ключевых слушателей. Ключевые слушатели имеют свое место в качестве низкоуровневого интерфейса для ввода с клавиатуры, но для ответа на отдельные клавиши привязки клавиш более подходят и, как правило, приводят к более легкому сохранению кода. Ключевым слушателям также сложно, если привязка клавиш должна быть активной, когда компонент не имеет фокуса. Некоторые из преимуществ привязок клавиш - это то, что они сами документируют, учитывают иерархию сдерживания, поощряют многократные фрагменты кода (Action объектов) и позволяют легко удалять, настраивать или совместно использовать действия. Кроме того, они упрощают изменение ключа, к которому привязано действие. Другим преимуществом Actions является то, что у них есть разрешенное состояние, которое обеспечивает простой способ отключить действие без необходимости отслеживать, к какому компоненту он подключен.

Текстовые компоненты

Как отмечено @Robin, текстовые компоненты также имеют DocumentListener & amp; DocumentFilter , который можно добавить для функциональности, более подходящей для текстовых документов. Подробнее о функциях текстовых компонентов см. В для слушателей & amp; фильтры .

21
ответ дан Andrew Thompson 19 August 2018 в 12:09
поделиться
  • 1
    Если мы хотим получить ссылочный ответ, я бы хотя бы включил «не использовать их для текстовых компонентов», а использовать DocumentListener, DocumentFilter & quot; также. Многие вопросы SO на KeyListener s связаны с текстовыми компонентами – Robin 8 March 2013 в 11:45
  • 2
    Хорошая идея. Готово. – Andrew Thompson 8 March 2013 в 11:55
  • 3
    +1, просто хотите расширить комментарий reusable chunks of code. Возможно, неясно, как можно распределять действия. Например, Actions также можно использовать для создания JMenuItems и JButtons. – camickr 8 March 2013 в 19:32
  1. KeyBindings (высокая абстракция)

преимущества

  • устанавливаемые, совместно используемые
  • , предназначенные для простых ярлыки, без нежелательных побочных эффектов (большинство из этих событий довольно просты и устанавливаются)
  • с уверенностью решает любую проблему с фокусом в окне (также можно установить, что в Java окно должно иметь фокус на экране)
  • Качать внутри, чтобы использовать KeyBindings, встроенные ярлыки, действия, больше в Привязки клавиш by @camickr (в Swing реализованы интересные ярлыки и действия)
  • вывод должен быть в Swing Action (такая же высокая абстракция в Swing)

Недостатки

  • невозможно переопределить все клавиши с клавиатуры
  • невозможно переопределить три или более клавиши в одно и то же время
  • код выглядит как очень сложный (не совсем верно, код сортирует в большинстве случаев по сравнению с тем же кодом из KeyListener)
  • удален для более подробной информации, чтобы увидеть c omnent by @camickr (требуется таймер Swing для повторных действий)
  • невозможно использовать () с помощью одного метода, реализованного в API

.

KeyListeners (низкоуровневый слушатель)

Преимущества

  • очень просты в использовании, интуитивно понятный код
  • очень короткий для двух ключевых событий
  • не требуется каких-либо знаний о Swing, Java
  • можно переопределить дерево или нажать несколько нажатий (например), для очень сложных клавишных клавиш, тогда не имеет значения, какой из них можно стрелять любые, отдельные ключевые события
  • можно запрограммировать на event.consume ()
  • можно прослушивать нефинансированные внутренние события из составных JComponents (JComboBox, JSpinner ...)

недостатки

  • недоступны для части контейнеров и JComponents
  • (J) Компонент должен быть владельцем фокуса и должен быть фокусируемым
  • , не предназначенный для Swing JComponents

.

AW TEventListener


  • , чтобы объединить все события Key и Mouse, слушателя с низким уровнем, как это возможно в Java
  • , в принципе нет причин использовать этот прослушиватель для большей части (даже очень сложный) GUI на основе Swing
  • Я вижу, что этот прослушиватель реализован в пользовательских компонентах на основе AWT. Необходимые одноранговые узлы взяты из родной ОС
  • , но для AWTEventListener есть отличные реализации Неактивность приложений и слушатели глобального события от @camickr

.

уведомление: упорядочение ключевых событий - это разные платформы по платформе


12
ответ дан mKorbel 19 August 2018 в 12:09
поделиться
  • 1
    +1 много деталей. Однако вам не нужен таймер Swing для повторных действий. KeyPressed будет запущен повторно. Обычно рекомендуется использовать таймер, чтобы вы могли контролировать интервал повтора. Та же логика применима к KeyEvents. – camickr 8 March 2013 в 19:34
  • 2
    @camickr вы правы, см. это и согласились в этом контексте – mKorbel 8 March 2013 в 20:30
  • 3
    @Don Hatch hmmm please whats no access to the x,y location, мой взгляд --- & gt; для лучшей помощи скорее поставить собственный вопрос на основе SSCCE, короткий, runnable, compilable, AFAIK есть ограничения для 3 или более keyPressed в одно и то же время (короткие клавиши) или реальный порядок keyPressed / release для коротких клавиш, для отдыха лучше , совместимый, управляемый для использования KeyBindings над KeyListener – mKorbel 30 August 2013 в 20:01
  • 4
    @mKorbel, я добавил комментарий раньше, но это была ошибка, поэтому я удалил его. Я смутил себя и думал, что keyEvents получил getX (), getY (), но они этого не делают. Неважно! – Don Hatch 31 August 2013 в 02:10
Другие вопросы по тегам:

Похожие вопросы: