Swing: добавление слушателя к компоненту и ВСЕ его оформление? - PullRequest
2 голосов
/ 19 мая 2009

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

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

  • mousePressed событие,
  • mouseDragged событие,
  • mouseReleased событие.

В настоящее время при перетаскивании я получаю нет вышеуказанных событий. JInternalFrame.

Я надеюсь, что есть какое-то стандартизированное решение, но я не смог его найти.

EDIT:
Некоторые люди предлагают использовать ComponentListener , но это не подойдет для мне. Мне нужно знать, когда пользователь перестает перетаскивать (mouseReleasedEvent), не при перемещении компонента.

Ответы [ 5 ]

2 голосов
/ 19 мая 2009

Да, вы можете добавить прослушиватель для всех компонентов контейнера. getComponents и добавьте слушателя. Вы должны суметь сделать это рекурсивно. Вы также можете использовать ContainerListener для проверки добавления и удаления компонентов.

Однако MouseListener и MouseMotionListener ведут себя странно, так как событие обычно всплывает до родителя, но не делает этого, если присутствует слушатель (как это для безнадежного дизайна?).

Ваш выбор:

  • Рекурсивное добавление слушателей (плохо, см. Выше)
  • Добавление слушателей к определенным компонентам (хрупкие)
  • Добавление "стеклянной панели" (грязный хак)
  • Добавление AWTEventListener к Toolkit (требуются разрешения)
  • Нажатие EventQueue и проверка через события (очевидно, не работает в Opera и Safari; останавливает работу системного копирования и вставки и перетаскивания апплета)
  • Использовать ComponentListener?
1 голос
/ 19 мая 2009

Я узнал, как это можно сделать, но что-то подсказывает мне, это грязный хак ;)

Ну, это работает, но кто может дать мне гарантию, что это работает везде?

// ctor goes here {

InternalFrameUI thisUI = getUI();
((BasicInternalFrameUI) thisUI).getNorthPane()
    .addMouseMotionListener(new MyMouseListener());

// }

NorthPane оказывается строкой заголовка окна.

0 голосов
/ 19 мая 2009

В документации JInternalFrame API написано:

Обычно вы добавляете JInternalFrames в JDesktopPane. Пользовательский интерфейс делегирует специфичные для внешнего вида действия к Объект DesktopManager поддерживается JDesktopPane.

Возможно, вам следует добавить слушателя в JDesktopPane.

0 голосов
/ 19 мая 2009

MouseListener / MouseMotionListener не будет обнаруживаться при перетаскивании JInternalFrame. Ваш лучший выбор для обнаружения движения - это использование ComponentListener на самом JInternalFrame.

0 голосов
/ 19 мая 2009

Вы, вероятно, должны использовать MouseMotionListener вместо MouseListener .

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