2009-05-19 3 views
2

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

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

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

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

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

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

ответ

0

Возможно, вы используете MouseMotionListener вместо MouseListener.

+0

MouseAdapter реализует оба, и добавить его с помощью addMouseListener (...) и addMouseMotionListener (...) –

0

В JInternalFrame API documentation, он говорит:

Как правило, вы добавляете JInternalFrames к JDesktopPane. Пользовательский интерфейс делегирует действия, зависящие от ощущения, к объекту DesktopManager , поддерживаемому JDesktopPane.

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

0

MouseListener/MouseMotionListener не обнаруживает при перетаскивании JInternalFrame. Лучше всего здесь обнаруживать движение, используя ComponentListener на самом JInternalFrame.

+0

ComponentListener запускает событие «componentMoved», но мне нужно знать, когда пользователь начала и окончания операции перетягивания , Пользователь может нажать кнопку мыши, но не перемещать компонент. ComponentListener не сказал бы мне, что кнопка мыши все еще нажата. –

+0

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

2

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

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

Ваш выбор:

  • Рекурсивный добавляющие слушателей (плохо, смотри выше)
  • Добавление слушателей к конкретным компонентам (хрупкими)
  • Добавление "оконному стеклу" (грязный хак)
  • Добавление AWTEventListener - Toolkit (required permissions)
  • Пуск EventQueue и проверка событий (не работает Opera и Safari по всей видимости; останавливает систему копирования и вставки и перетаскивания апплета с работы)
  • Использование ComponentListener?
+0

Пробовал: стеклянное стекло не принимает необходимые события. Я думаю, что я собираюсь написать собственный компонент для перетаскивания (уже сделано один раз) –

+0

Стекло в области содержимого внутреннего фрейма (очевидно) не работает. –

+0

А, извините, вы имеете в виду стеклянную панель родителя JInternalFrame. Почему это грязный хак? –

1

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

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

// ctor goes here { 

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

// } 

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

Смежные вопросы