PDA

View Full Version : Вопрос по Яве


prius
26-01-2009, 13:25
Рас здесь такие спецы водятся, решил спросит вопрос, на который сам пока решения не нашел. Есть самодельный Component, помещенный на JPanel . Хотелось бы отловить момент, когда мыша попадает на определенную область компонента. Проблемы возникают, когда мыша нажата за границей компонента, а потом затащенна на компонент. В этом случае dragMouse не приходит. Кто-нибудь такое дело отлавливал?

prius
26-01-2009, 18:37
Хмм... вроде спецов много, а на вопрос чайника никто не ответил :|

Бабай
26-01-2009, 20:10
Поразбежалися, сокровища ищут, тесты проводят, кризис борют...

Suhov
26-01-2009, 20:43
Рас здесь такие спецы водятся, решил спросит вопрос, на который сам пока решения не нашел. Есть самодельный Component, помещенный на JPanel . Хотелось бы отловить момент, когда мыша попадает на определенную область компонента. Проблемы возникают, когда мыша нажата за границей компонента, а потом затащенна на компонент. В этом случае dragMouse не приходит. Кто-нибудь такое дело отлавливал?

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

prius
26-01-2009, 21:54
мне кажется что если мыша нажата в контексте одного компонента, то и эвенты будут роутиться тому же компоненту, даже если выйти из его контекста, до тех пор пока не отжата, и отжатие ему пойдёт. просто драг, без нажатия, будет приходить тем, над которыми курсор, потому что контексты меняются вместе с движением. причём если драг не обрабатывается компонентом, то он передаётся дальше по цепочке его детям, входящим в контекст, и находящимся под курсором.

Ну, я уже понял, что драг будет приходить туда, где его нажали. Однако, по цепочке он не передается. Только если самому передавать начать, наверное. Но, на кнопку приходит МоусеЕнтер евент. Можно как-нибудь перехватить тот самый драг евент или вообще его аннулировать?

Suhov
26-01-2009, 23:12
Ну, я уже понял, что драг будет приходить туда, где его нажали. Однако, по цепочке он не передается. Только если самому передавать начать, наверное. Но, на кнопку приходит МоусеЕнтер евент. Можно как-нибудь перехватить тот самый драг евент или вообще его аннулировать?

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

я в первом посте неверно выразился. по цепочке передаётся не драг, а простой мув. драг чётко привязан к тому, в чьём контексте произошёл моусеентер.

а зачем вам драг аннулировать? если вы с драгом который адресован вашему компоненту хотите что то делать, то делайте. аналогия с виндой очень прямая. поэкспериментируйте с драгами на рабочем столе - щёлкнули на пустом месте и потянули, всё стало выделяться - главное окно рабочего стола это делает, щёлкнули на папочке и потянули - папочка поехала, тоже окно рабочего стола это делает, а если например над этими папками открыто окошко ворда, и щёлкнули в ворде и потянули, то ворд начал выделять, выехали за пределы окна - всё равно ворд выделяет - потому что ему приходит всё. а если щёлкнули на рабочем столе и потянули, заехали в окно ворда - ворд не реагирует, потому как не получает ничего. и это правильно, так работает роутинг эвентов.

prius
26-01-2009, 23:28
драг по цепочке и не должен передаваться. он поступает тому, в чьём контексте была мыша нажата. если там не обрабатывается, то пропадает. компонент может делать с эвентом что захочет - может и детям предать, только своим. поэтому если ваш компонент создан в контексте другого, который получает драг, то это уж его дело - передавать вашему или нет.

я в первом посте неверно выразился. по цепочке передаётся не драг, а простой мув. драг чётко привязан к тому, в чьём контексте произошёл моусеентер.

а зачем вам драг аннулировать? если вы с драгом который адресован вашему компоненту хотите что то делать, то делайте. аналогия с виндой очень прямая. поэкспериментируйте с драгами на рабочем столе - щёлкнули на пустом месте и потянули, всё стало выделяться - главное окно рабочего стола это делает, щёлкнули на папочке и потянули - папочка поехала, тоже окно рабочего стола это делает, а если например над этими папками открыто окошко ворда, и щёлкнули в ворде и потянули, то ворд начал выделять, выехали за пределы окна - всё равно ворд выделяет - потому что ему приходит всё. а если щёлкнули на рабочем столе и потянули, заехали в окно ворда - ворд не реагирует, потому как не получает ничего. и это правильно, так работает роутинг эвентов.
Ну, мне оно надо для следующего. У меня есть собственная кнопка. Если начать драгать из-за ее пределов, а потом затащить на нее, то ни мышаНад и мышаРелесе не придотят. Вобщем-то с этим можно жить, но все-равно выглядит, как глюк.

Suhov
26-01-2009, 23:32
Ну, мне оно надо для следующего. У меня есть собственная кнопка. Если начать драгать из-за ее пределов, а потом затащить на нее, то ни мышаНад и мышаРелесе не придотят. Вобщем-то с этим можно жить, но все-равно выглядит, как глюк.

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

prius
27-01-2009, 02:13
нормальное поведение. не глюк. чтобы реализовать драг_и_дроп, если этого хочется, должна быть поддержка со стороны ос. одной явы недостаточно. но для кнопок я даже юзкейс сходу не могу придумать что на них можно кидать, чтобы они хавали. обычно из одного контейнера перекидывают что нибудь в другой, типа файл открыть или скопировать, и тд.

Узкеиз такой: есть кнопка нестандартной формы. Точнее, форма у компонента стандартная (прямоугольная), но активная зона кнопки прорисованна внутри. Отсюда и есть потребность в том, чтобы отловить момент, когда мыша доходит до интересующего места на коомпоненте. Если бы кнопка занимала весь компонент, то евенты моусеЕнтры, моусеЕхит отлавливаются очень даже хорошо. Но внутри компонента отлавливать можно только моусеМове, моусеДраг. Ну да ладно, не буду больше времени на это тратить. Может потом что-нибудь найду.

prius
12-02-2009, 01:45
Еще один вопрос. Вроде - ерунда, а как-то не получается.
Хочу открыть окно на весь экран, но с учетом линейки(старт). Но никак не могу выцарапать измерения свободной площади. Кто-нибудь сталкивался с такой проблемой в Линухе? Toolkit выдает всю площадь экрана и линейка накрывает низ окна.