Стандартизированы ли имена действий по умолчанию в ActionMap компонента Swing? - PullRequest
6 голосов
/ 21 мая 2009

Скажем, у меня есть стандартный компонент Swing, такой как JSlider, но я хочу немного откорректировать карту ввода. Карты ввода по умолчанию и карта действий устанавливаются по внешнему виду, и я хочу повторно использовать некоторые из действий, уже доступных в ActionMap. Для этого мне нужно поместить ключ записи ActionMap в значение записи InputMap.

Я могу легко найти ключи ActionMap (всегда String) во время выполнения с помощью отладчика и использовать его повторно. Это будет работать - гарантированно на моей версии JDK и L & F .

Таким образом, вопрос в том, задокументированы ли где-нибудь ключи для действий компонента Swing по умолчанию, могут ли они «законно» меняться со временем (то есть с версии JDK на версию JDK или с L & F на L & F) и видели ли вы такое изменение на практике?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 29 мая 2009

Хорошо, мне понадобилось время, чтобы найти это.

Короче говоря, они не кажутся стандартизированными (много) и не видят документально (много).

Класс LookAndFeel является ключом. Это иерархия:

  • LookAndFeel

  • BasicLookAndFeel

    • MetalLookAndFeel
    • MotifLookAndFeel
    • WindowsLookAndFeel
  • MultiLookAndFeel

В классе BasicLookAndFeel вы можете найти сопоставления по умолчанию для действий и привязок клавиш, которые будут наследоваться всеми другими классами. Таким образом, вы можете считать этот класс стандартом . Вы можете видеть, что при создании объекта «по умолчанию», примерно как 498 для Java 1.4.2_17.

Дополнительные привязки и перезаписи клавиш можно найти на разработчиках, например WindowsLookAndFeel.

Некоторые из стандартизированных имен можно найти в классе DefaultEditorKit в виде статических полей. Те, кажется, безопасны в использовании и переназначении. Их использование можно увидеть в классах WindowsLookAndFeel и MotifLookAndFeel. Я чувствовал бы себя в безопасности, предполагая, что эти действия будут постоянными.

Короче говоря, действия, определенные в DefaultEditorKit, вряд ли изменятся. Однако привязки клавиш полностью изменяются между реализациями L & F. Извлеките действие из карты, используя DefaultEditorKit.something, и оно должно работать в разных версиях. Пример из DefaultEditorAction, который вы могли бы использовать с JSlider:

/**
 * Name of the Action for extending the selection
 * by moving the caret logically forward one position.
 * @see #getActions
 */
public static final String selectionForwardAction = "selection-forward";
3 голосов
/ 25 мая 2009

ActionMap и InputMap имеют getParent() и setParent(), поэтому решение:

  1. Создайте новую карту с несколькими изменениями, которые вы хотите внести.
  2. Запрос вашего компонента для его карты
  3. Установить эту карту в качестве родителя вашей новой карты
  4. Установите новую карту в компоненте

Таким образом, ваши изменения перезаписывают и расширяют существующие сопоставления.

[РЕДАКТИРОВАТЬ] Я не знаю, что где-то есть список всех ключей. Но такие вещи, как maxScroll, должны быть «стабильными», то есть они должны существовать в будущих версиях (не то, что Swing сильно изменился за последние 10 лет ...)

Так что, если вам нужно заменить определенное отображение, используйте подход выше. Таким образом, вы сохраняете все существующие отображения L & F (сохраняя работоспособность компонента, даже если вы допустили ошибку). Если вы зависите от перезаписи определенного ключа, я предлагаю проверить, существует ли ключ, и выдать ошибку, если она внезапно исчезнет.

Таким образом, ваш код будет работать (возможно, в течение многих лет), и если он сломается, он будет активно сообщать вам об изменениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...