| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > Swing. Взаимодействие контролов на интерфейсе |
| Автор: anti_snayper 8.2.2011, 09:49 |
| Есть календарь, написанный на свинге. Выполнен в виде JMenuPopup с набором кнопок, ддл, текстовым полем. Он встраивается в интерфейс с другими контролами. Нужно чтобы при клике на внешнем контроле календарь скрывался, при клике на внутреннем позволял произвести выбор значения(например, ддл выбора месяца). Я могу перехватывать в нем события changeState или связанные с изменением фокуса. Но не знаю как узнать от кого оно пришло. К примеру, в случае с ддл, ивент говорит, что создатель события - MenuSelectionManager, из которого ничего полезного выудить не получается. Как решают такие ситуации? Наверняка же должен какой-то типовой подход... Спасибо. |
| Автор: _Y_ 8.2.2011, 21:35 |
| Ну а если разными слушателями (Listener) разные клики отслеживать? А в слушателе прописать атрибут, который знает "хозяина"? |
| Автор: anti_snayper 9.2.2011, 02:01 |
| Утром торопился потому написал видимо не очень понятно. Попробую еще раз... На интерфейсе есть JComboBox-ы. При клике на каком либо из них автоматом генерится стандартное событие, которое оповещает остальные элементы интерфейса о том что им надо закрыться. Это обычное поведение любого интерфейса. Я добавил выпадающий по клику на кнопке календарь, который выполнен в виде JMenuPopup. В нем есть JComboBox с месяцами. Так вот при клике на этом ддл - календарь закрывается. Т.е. этот контрол генерит событие которое закрывает свой собственный контейнер(JMenuPopup). Такого само собой быть не должно. Я недавно занялся свингом и вполне возможно что-то недопонимаю. |
| Автор: _Y_ 9.2.2011, 10:33 |
Вместо стандартного Listener пишешь свой, наследующий от стандартного. Я сейчас не могу посмотреть видно ли из кода Listener-а на каком контроле кликнули.
Хочешь напишу код. Но быстро не обещаю. В форуме сижу пока компы делом заняты. Может вечерком или завтра. |
| Автор: anti_snayper 9.2.2011, 11:10 |
| За пример был бы очень благодарен... Можете сказать какой event оповещает остальные элементы интерфейса о своем закрытии? |
| Автор: _Y_ 9.2.2011, 23:14 | ||
| Поскольку я не знаю что за классы вы используете в качестве календарей, набросал пример иллюстрирующий общий принцип. Работает по первому варианту. Оказалось я помнил правильно и событие знает на каком объекте кликнули. Програмка показывает множество кнопок. При клике на одну кнопку она увеличивается, а размеры остальных становятся стандартными. Что непонятно - спрашивайте.
|
| Автор: anti_snayper 10.2.2011, 00:55 | ||
Вот простой пример . Есть 2 JComboBoxa. Кликаем по первому - он открывается. Кликаем по второму - первый закрывается, второй открывается. Вот меня и интересует. Какой listener мне нужно переопределить и как, чтобы они друг друга не закрывали?
|
| Автор: _Y_ 11.2.2011, 11:03 |
| Эге. Теперь проблема понятнее. Надо подумать. Закрытие JComboBox, видимо, связано с потерей им фокуса, но я не уверен - надо проверять. |
| Автор: anti_snayper 11.2.2011, 17:14 |
| Решил оставить поведение JComboBox-ов как есть, адаптировав под него интерфейс. P.S. Вообще была идея использовать вместо JMenuPopup - JDialog. При этом проблема решается сама собой, но нужно поколдовать над диалоговым окном для его кастомизации под попап. Думаю, что этот вариант вполне реализуем, но надо проверять. |
| Автор: _Y_ 11.2.2011, 22:36 |
| Если не заморачиваться именно с JComboBox-ами, то можно написать самому их иммитацию. На JPanel поместить текстовое поле и обычный список JList ниже него. Этот список прятать-показывать когда захочется. Но в этом случае, естественно, придется много кодить рутинных вещей. |