MouseMotionListener bez JComponentu

Odpowiedz Nowy wątek
2011-09-21 23:15

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Witam ponownie

Pytanie mam nastepujace, czy jest sposob na zaimplementowanie listenerow MouseMotionListener i MouseListener w zwyklej klasie bez obiektu JFrame i pochodnych ??

Pozostało 580 znaków

2011-09-22 15:17

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Chodzilo mi o to ze, czy sie da zebrac dane o kliknieciu w innym miejscu, poza komponentem Javy na ekranie.
zwykla pozycja myszki moze byc zebrana z

MouseInfo.getPointerInfo()

ale chcialbym zeby to dzialalo przy kliknieciu a nie przy ruchu (na pulpicie).
:)

edytowany 1x, ostatnio: przelew, 2011-09-22 15:17
Zrób nieudekorowane (niewidoczne) okno na całą powierzchnię ekranu (nawet wirtualnego). Przechwycisz całą działalność myszy. Za pomocą "chowania" tego okna i Robota możesz, po wstępnej obróbce, przekazać te zdarzenia poza aplikację Java lub zareagować na nie. - Olamagato 2011-09-25 02:34

Pozostało 580 znaków

2011-09-22 17:08

Rejestracja: 12 lat temu

Ostatnio: 4 godziny temu

0

Z tego co ja czytałem (a szukałem informacji na ten temat przy pisaniu ostatniego programu), to te zdarzenia są przesyłane do konkretnej aplikacji (i w dół jej hierarchii komponentów), nie ma możliwości przechwycenia zdarzeń globalnych. To przy użyciu, powiedziałbym - normalnych środków. Można oczywiście użyć JNI (Java Native Interface) i skorzystać z bogactwa np. WinAPI (zakładamy hook'a i przejmujemy zdarzenia globalnie). Natomiast wtedy wiadomo, że program musi być uruchamiany na Windowsie.

Pozostało 580 znaków

2011-09-26 19:53

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

HAAAAAAAAAAAa a moj promotor podpowiedzial mi pewien pomysl calkiem abstrakcyjny ale na pierwszy rzut oka powinien dziala:

  1. robimy okno bez ramki na cały ekran, nadajemy oknu 100% przezroczystości
  2. otrzymujemy kliknięcie zwykłym MouseListenerem i odczytujemy pozycję kliknięcia
  3. ukrywamy przezroczyste okno
  4. przekazujemy kliknięcie klasą java.awt.Robot - można nią symulować klikanie na całym ekranie
  5. przywracamy przezroczyste okno i od nowa pkt 2.
Przecież Olamagato napisał to w komentarzu wyżej - szypxx 2011-09-26 20:37

Pozostało 580 znaków

2011-09-27 13:05

Rejestracja: 12 lat temu

Ostatnio: 4 godziny temu

0

Owszem, daje to sporo pola do popisu i pewnie wystarczy. Ale czy jest idealne? Np. czy da się wykryć kliknięcie na obszarze paska zadań, bo np. pod Ubuntu okno nie wjedzie Ci na ten panel z Programy, Miejsca, System, ani żaden inny panel. Chyba, że się mylę :P Ale i tak mamy spory obszar pod kontrolą.

Pozostało 580 znaków

2011-09-27 16:25

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Od bodajze Javy 4 lub 5 jest mozliwosc robienia bezpaskowego/bezramkowego okna lub okna na całą powierzchnie monitora jak w grach.
Chwile bawilem sie tym rozwiazaniem i zauwazylem pierwszy problem, przy 100% transparentnosci okno trzyma pierwsza warstwe za sobą :) czyli nie zmienia swojego wypelnienia jesli zmieni sie tlo :/

Ale teoretycznie po jednym kliknieciu ramka ma znikac i pojawic sie znowu z nowym tlem, tylko co jesli tlo sie zmieni i nienadazy za tym okno :) ???

CDN

Przed chwila znalazlem tez natywna obsluge myszki w bibliotece do gier http://lwjgl.org/demos.php// ale boje sie natywnej Javy :/

Pozostało 580 znaków

2011-09-27 19:51

Rejestracja: 12 lat temu

Ostatnio: 4 godziny temu

0

Nie zrozumieliśmy się - nie chodzi mi o belkę tytułową przezroczystego okna, tylko te panele zaznaczone w załączniku na czerwono. Okno przeglądarki jest zmaksymalizowane i nie wchodzi na nie, dlatego nie przejmiemy kliknięć na tamtych obszarach pomimo tego sposobu z przezroczystym oknem. Ale jak już mówiłem, tak czy siak mamy duży obszar, gdzie przechwytujemy zdarzenia i być może nie ma się czym przejmować, ale rozwiązanie nie jest idealne w sensie, że obsłużymy wszystkie kliknięcia użytkownika.

185939-mousemotionlistener_bez_jcomponentu?mode=download&id=1083 </img>

edytowany 1x, ostatnio: Mrowa, 2011-09-27 19:52

Pozostało 580 znaków

2011-09-27 21:30

Rejestracja: 11 lat temu

Ostatnio: 3 dni temu

Lokalizacja: Polska, Warszawa

0

Da się to przeskoczyć przez wymuszenia nieudekorowanego okna z flagą taką jak "Always on Top". Java jednak chyba nie obsługuje takiej flagi i trzeba by to robić nieprzenośnie dla każdego systemu GUI osobno. Sprawdziłem, że program Javy wchodzi na obszary zajmowane przez te paski, albo jeżeli zdejmie się im ten specjalny status, albo przydzieli się go okienku kontrolowanemu przez JVM. Tak więc ta druga opcja rozwiązuje ten problem całkowicie. Tyle, że (na razie?) nieprzenośnie.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 1x, ostatnio: Olamagato, 2011-09-27 21:31
Dzięki za rozjaśnienie - ja dopiero w Javie stawiam pierwsze kroki. To mi się podoba - kulturalna, rzeczowa dyskusja, bez jakiegoś wywyższania, czy poniżania za poziom wiedzy. Uczą się wszyscy - nie tylko autor tematu. Dyskusja ciekawa, jeżeli będę miał taki problem kiedyś, to przynajmniej uświadomiłeś mnie, że jeszcze jest jakaś nadzieja na wdrożenie takiego podejścia ;) - Mrowa 2011-09-28 00:13

Pozostało 580 znaków

2011-09-28 12:18

Rejestracja: 8 lat temu

Ostatnio: 8 lat temu

0

Olamagato, a propo always on top: http://stackoverflow.com/ques[...]ways-on-top-windows-with-java

"Sprawdziłem, że program Javy wchodzi na obszary zajmowane przez te paski, albo jeżeli zdejmie się im ten specjalny status, albo przydzieli się go okienku kontrolowanemu przez JVM. Tak więc ta druga opcja rozwiązuje ten problem całkowicie."

Nie do konca rozumiem :)

tutaj jest opcja wrzucenia na cały monitor od 0,0 do max, max: http://download.oracle.com/ja[...]l/extra/fullscreen/index.html

edytowany 1x, ostatnio: przelew, 2011-09-28 12:19

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0