Я читал о регистрации объектов «Действие» с несколькими компонентами, и я натолкнулся на рецепт регистрации (привязки) объекта Действие к объекту Нажатие клавиши .
В погоне я наткнулся на этот кусок кода:
InputMap imap = panel.getInputMap(JComponent.WHEN_FOCUSED);
imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
ActionMap amap = panel.getActionMap();
amap.put("panel.yellow", yellowAction)
Теперь это работает так, что существует один уровень косвенности при регистрации ваших нажатий клавиш с помощью объектов Action. Во-первых, вы связываете нажатие клавиши с каким-либо произвольным объектом в одной из карт ввода (в нашем примере это карта, соответствующая константе WHEN_FOCUSED) компонента, а во-вторых, вы регистрируете действие с таким же ссылка на другую карту, ActionMap, поддерживаемую компонентом.
Теперь я сомневаюсь, что, если я предполагаю, что семантика сопоставления нажатия клавиши с объектами действия выполняется с использованием подобия ссылки на промежуточный объект, находящейся на этих двух картах, то где гарантия того, что это равенство всегда будет выполняться, если ссылка на объект, которую я использовал, действительно не определяет правильное понятие равенства (или хэш-код).
Например, в моем примере я присоединяю нажатие клавиши с экземпляром String "panel.yellow" в одном из InputMaps, затем я пытаюсь присоединить объект действия с тем же String "panel.yellow" в ActionMap панели. Теперь теоретически JVM не гарантирует, что оба этих экземпляра String (которые я жестко закодировал) будут ссылаться на один и тот же объект String! И что еще хуже, если JVM не предоставляет понятие равенства содержимого для строк, то нет никакого способа, мой объект действия может быть успешно сопоставлен с моим нажатием клавиши. Это так же верно для любого объекта, который я могу использовать для промежуточного связывания нажатия клавиши с объектами действия, и для которого я не определил никакого понятия равенства (или хэш-кода), кроме ссылочного равенства, которое определяет класс Object.
Может кто-нибудь уточнить, пожалуйста.
Avid