Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Поиск компонента под событие


Автор: Prospekt 22.5.2014, 10:51
Имеется некая переопределенная JPanel на которой находятся самописные элементы (наследники JComponent).

Необходимо сделать так, чтобы при одних условиях события мыши эти компоненты не обрабатывали, а при других обрабатывали.

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

Думал, что события опускается по дереву, т.е. что каждая панель проверяет попадает ли мышь на какой-нибудь из её подэлементов, и если да, то делигирует вызов этому подэлементу. Все это работает до тех пор, пока не найдется самый нижний узел, который вызовет уже свой собственный слушатель.
А вот и фиг. 2 часа экспериментов с JPanel не дали результатов. Походу поиск целевого элемента происходит где-то в другом месте, и сама панель, содержащая целевой элемент никакого оповещения о событии мыши не получает.

Чего хочу от вас:
1. Кто подскажет сам процесс движения события и поиска для него целевого элемента.
2. Какими способами можно сделать то, что я описал?
3. Является ли ниже описанное решение единственно разумным?

Каждый подэлемент имеет слушателя, который обращается к дочерней панеле (через getParent()) и вызывает у неё некий метод, который уже в свою очередь чего-то там думает, и в случае успеха вызывает другой метод (отвечающий за логику обработки события) целевого элемента.
Т.е. движение идет так: Целевой элемент (его слушатель) -> Дочерняя панель -> Целевой элемент(обработка события).

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

Автор: Mirkes 23.5.2014, 17:09
Вообще говоря parent это предок (родитель) а не дочь.
Схема легко реализуема, за исключением одного момента - вложенные компоненты должны знать метод, который вызывать. Если используется потомок JPanel, то нет проблем:
Код

     ((JSomePanel)getParent()).someMethod();

где someMethod() тот самый метод, который нужно позвать, а JSomePanel - имя класса панели, куда складывались компоненты.
А вот если нужно обеспечить наличие метода у всех вложенных компонентов, то можно либо объявить и реализовать интерфейс, либо создать общего предка, который, кстати, может и заниматься вызовом метода предка.
Я подобные вещи проделывал неоднократно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)