Image
27.6.2016 0 Comments

Programujeme v Jave /10.časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

Udalosti menu, klávesnice a myši

Tentoraz si skompletizujeme svoje vedomosti o tvorbe a obsluhe udalostí menu rozprávaním o udalostnom modeli komponentu JPopupMenu a JMenuItem a potom sa budeme venovať udalostiam súvisiacim so vstupom z klávesnice a myši.

Udalosti a menu

V súvislosti s menu môžeme rozoznať dva typy udalostí – tie, ktoré sú vyvolané pri výbere jednotlivých položiek, a tie, ktoré sú vyvolané v súvislosti s ovládaním menu – zobrazenie (rozbalenie) menu, skrytie menu alebo označenie a odznačenie menu. Obsluhu prvého typu udalostí už zabezpečiť viete – venovali sme sa jej v predošlej časti, je realizovaná prostredníctvom registrácie poslucháča ActionListener pre danú položku. Druhému typu udalostí sa budeme venovať teraz.

Udalosti komponentu JMenuItem

Komponent JMenuItem umožňuje registráciu dvoch typov poslucháčov – MenuDragMouseListener a MenuKeyListener. Prvý z nich slúži na obsluhu udalostí drag&drop v menu, vďaka čomu môžete používateľovi umožniť presúvanie položiek v menu. Keďže ide o dosť obsiahly a nie príliš využiteľný koncept, nebudeme sa mu v tomto seriáli venovať. Keby ste predsa len chceli vedieť viac, odporúčam vám nahliadnuť do API dokumentácie. Poslucháč MenuKeyListener slúži na zachytávanie udalostí stlačenia klávesu v prípade, že položka menu, v ktorej je tento poslucháč zaregistrovaný, je viditeľná (zobrazená). Rozhranie MenuKeyListener deklaruje nasledujúce tri metódy:

menuKeyPressed() – metóda volaná hneď, ako používateľ stlačí kláves,

menuKeyTyped() – metóda volaná po klepnutí na kláves, teda po jeho stlačení a uvoľnení,

menuKeyReleased() – metóda volaná po uvoľnení klávesu.

Tieto metódy sú volané u registrovaných poslucháčov po stlačení klávesu v rovnakom poradí, v akom sú vymenované, teda najprv je generovaná udalosť stlačenia klávesu a po jeho uvoľnení je najprv generovaná udalosť „klepnutia“ na kláves a nakoniec udalosť uvoľnenia klávesu. Všetkým týmto metódam je ako jediný parameter odovzdávaný odkaz na objekt typu MenuKeyEvent, ktorý zapuzdruje informáciu o udalosti. Trieda MenuKeyEvent je odvodená od triedy KeyEvent (tej sme sa už venovali nedávno) a dedí od nej všetky metódy a atribúty, teda aj tie na zistenie konkrétneho klávesu, ktorý bol stlačený, prípadne na zistenie stavu modifikátorov (funkčných klávesov, ako napr. Ctrl, Alt alebo Shift). Vďaka tomuto všetkému môžu vaše položky menu reagovať na všetky stlačenia klávesov alebo ich kombináciu. Reagovať však na ne môžu iba vtedy, keď sú viditeľné, teda ak je zobrazená tá časť menu, v ktorej sú umiestnené. Ak vtedy stlačí používateľ nejaký kláves alebo kombináciu klávesov, sú vyvolané príslušné udalosti a metódy registrovaných poslucháčov. Volaní sú poslucháči všetkých zobrazených položiek, to znamená, že jedno stlačenie klávesu môže vyvolať viacero udalostí. Poslucháča je možné pri položke typu JMenuItem zaregistrovať metódou addMenuKeyListener() a následne môžete obsluhovať príslušné udalosti podľa potreby. Pokiaľ vám stačí obsluha iba niektorej konkrétnej udalosti, budete musieť zvyšné metódy takisto implementovať, hoci ako prázdne. Týchto poslucháčov je síce možné použiť na volanie potrebných metód pri stlačení klávesu určeného na aktiváciu konkrétnej položky menu, ale pre tento prípad existuje elegantnejšie riešenie s použitím akcelerátorov (alebo aj horúcich klávesov), ktoré sme si ukázali v predchádzajúcej časti. Je však možné, že budete niekedy potrebovať implementovať aj práve poslucháča typu MenuKeyListener, čo by pre vás teraz už nemal byť žiadny problém.

Udalosti komponentu JMenu

Trieda JMenu je potomkom triedy JMenuItem, čo znamená, že umožňuje registráciu rovnakých typov poslucháčov ako táto jej rodičovská trieda. Keďže ide o kontajner, umožňuje navyše registráciu ďalšieho typu poslucháčov – MenuListener – pomocou metódy addMenuListener(). Toto rozhranie deklaruje tri metódy:

menuSelected() – metóda volaná pri označení položky menu,

menuDeselected() – metóda volaná pri zrušení označenia položky menu,

menuCanceled() – metóda volaná pri zrušení zobrazenia podmenu položky menu (napr. pri stlačení klávesu Esc).

Metóda menuSelected() je volaná pri označení položky menu, ale ešte pred rozbalením jej podmenu. Tento fakt je možné využiť na úpravu položiek podmenu ešte pred ich samotným zobrazením, napr. ak ich povolenie/zakázanie závisí od nejakého konkrétneho stavu programu, ktorý je známy až počas jeho behu, a nie počas návrhu programu:

 
  class MyListener implements MenuListener {
 
    public void menuCanceled(MenuEvent me) {
      // obsluha udalosti zrušenia podmenu
    }
 
    public void menuDeselected(MenuEvent me) {
      // obsluha udalosti odznačenia položky menu
    }
 
    public void menuSelected(MenuEvent me) {
      // úprava položiek vnoreného podmenu, obsluha udalosti označenia menu
    }
 
  }

Všetkým metódam definovaným v rozhraní MenuListener je odovzdávaný ako parameter objekt typu MenuEvent, ktorý zapuzdruje informácie o udalosti (v podstate jedinou využiteľnou metódou tejto triedy je metóda getSource(), zdedená od triedy EventObject, ktorá vráti odkaz na objekt, ktorý je pôvodcom udalosti).

Udalosti pop-up menu

Komponent JPopupMenu sa od klasického menu trochu líši, a aj preto umožňuje táto trieda registráciu jedného špeciálneho poslucháča – PopupMenuListener. Registrácia a odregistrovanie tohto poslucháča sa riadi štandardnými konvenciami, teda zaregistrovanie je možné metódou addPopupMenuListener() a odregistrovanie metódou removePopupMenuListener(). Obe metódy sú, samozrejme, zahrnuté v rozhraní triedy JPopupMenu. Rozhranie PopupMenuListener poskytuje tri metódy:

popupMenuCanceled() – metóda volaná vždy, keď je zrušené zobrazenie príslušného pop-up menu,

popupMenuWillBecomeInvisible() – metóda volaná tesne pred zneviditeľnením príslušného pop-up menu (k zneviditeľneniu môže dôjsť pri zrušení zobrazenia menu, po aktivovaní niektorého JMenuItem alebo po kliknutí mimo plochy pop-up menu),

popupMenuWillBecomeVisible() – metóda volaná tesne pred zobrazením príslušného pop-up menu, čo je možné využiť napr. na úpravu jeho položiek.

Každá z týchto metód preberá ako parameter odkaz na objekt typu PopupMenuEvent, ktorý zapuzdruje informácie o danej udalosti. Keďže ide o potomka triedy EventObject, jediná dôležitá informácia, ktorú môžete získať, je odkaz na objekt, ktorý udalosť vyvolal (v tomto prípade pop-up menu), a to metódou getSource().

Teraz si trošku rozšírime vedomosti o udalostiach týkajúcich sa používateľského vstupu z myši a klávesnice, aby sme si potom mohli ukázať použitie poslucháča PopupMenuListener.

Udalosti myši

Pri práci používateľa s myšou vzniká viacero udalostí, na ktoré často potrebujeme v našej aplikácii reagovať. Tieto udalosti je možné kategorizovať do troch skupín – udalosti spojené s pohybom myši, udalosti spojené so stláčaním tlačidiel myši a udalosti spojené s pohybom kolieska myši. Aj preto existujú tri základné druhy poslucháčov pre obsluhu udalostí myši – MouseMotionListener, MouseListener a MouseWheelListener.

Uvažovať o udalostiach spojených s interakciou používateľa s aplikáciou prostredníctvom myši má význam iba v prípade aplikácií GUI, takže všetky druhy poslucháčov, ktoré sa v súvislosti s udalosťami myši používajú, je možné zaregistrovať v objektoch, ktoré sú inštanciami triedy Component (balík java.awt) alebo ktorejkoľvek jej podtriedy (čo sú teda všetky komponenty knižnice AWT aj Swing).

Ako prvému sa budeme venovať poslucháčovi MouseListener, ktorý predstavuje akýsi základ pre prácu s obsluhou udalostí myši. Poskytuje 5 metód na obsluhu základných udalostí vznikajúcich pri používaní myši:

mousePressed() – metóda volaná vždy, keď používateľ stlačí niektoré z tlačidiel myši nad komponentom, ku ktorému je tento poslucháč priradený (pri ktorom je zaregistrovaný),

mouseReleased() – metóda volaná po uvoľnení predtým stlačeného tlačidla,

mouseClicked() – metóda volaná po kliknutí na tlačidlo myši, udalosť kliknutia pozostáva zo stlačenia a uvoľnenia tlačidla myši, takže najprv je generovaná udalosť stlačenia tlačidla myši [a volaná metóda mousePressed()], následne udalosť uvoľnenia tlačidla myši [a volaná metóda mouseReleased()] a až nakoniec udalosť kliknutia [a teda volanie metódy mouseClicked() je vykonané ako posledné],

mouseEntered() – metóda volaná vždy pri presune kurzora myši nad plochu komponentu,

mouseExited() – metóda volaná vždy, keď kurzor myši opustí priestor nad plochou komponentu.

Všetkým metódam je odovzdávaný ako parameter odkaz na objekt typu MouseEvent. Tento objekt je používaný na zapuzdrenie informácií o udalosti aj ostatnými poslucháčmi pre obsluhu udalostí myši, ktorým sa ešte len budeme venovať. MouseEvent je potomkom triedy InputEvent a poskytuje niekoľko užitočných metód, dôležitých na správnu identifikáciu typu udalosti.

Metódy getPoint(), getX() a getY() využijete vtedy, keď budete potrebovať získať informáciu o presnej polohe kurzora myši v okamihu, keď došlo k vygenerovaniu danej udalosti. Oveľa zaujímavejšia je však metóda getClickCount(), ktorá nám umožňuje zistiť, koľkokrát po sebe došlo k udalosti kliknutia, čo v praxi znamená možnosť reakcie na používateľský „dvojklik“, prípadne „trojklik“.

Od svojich predkov dedí táto trieda možnosť získať odkaz na objekt, ktorý udalosť vyvolal [metódou getSource()], a takisto možnosť ID udalosti pomocou metódy getID(), ktorej návratovú hodnotu môžete porovnávať s konštantami definovanými v triede MouseEvent (pozri API dokumentáciu) a na základe toho identifikovať typ udalosti.

Ďalšia užitočná metóda je getModifiers(), ktorú dedí od triedy InputEvent. Táto metóda vráti flag vyjadrujúci stav modifikátorov v okamihu vygenerovania udalosti. Pod pojmom modifikátor rozumieme stav modifikátorových klávesov Ctrl, Alt, Alt Graph (tzv. pravý Alt) a Shift a takisto stav tlačidiel myši. Z tohto flagu je možné získavať informácie o stave modifikátorov prostredníctvom porovnania príslušnej masky preddefinovanej v triede InputEvent. Ak budete chcieť napr. zistiť stav klávesu Alt v čase vygenerovania udalosti, vykonáte operáciu bitového súčinu s flagom vráteným metódou getModifiers() a maskou ALT_DOWN_MASK. Návratová hodnota 0 potom predstavuje informáciu o tom, že kláves Alt nie stlačený, zatiaľ čo nenulová hodnota predstavuje stlačený kláves Alt. Rovnako to je aj s ostatnými modifikátormi. Môžete rovnako zisťovať stav viacerých modifikátorov naraz vykonaním operácie bitového súčtu medzi preverovanými modifikátormi a následným vykonaním operácie bitového súčinu s flagom vráteným funkciou getModifiers().

Jednoduchším spôsobom, ako získať stav modifikátorových klávesov v okamihu vygenerovania udalosti, je použitie metód isAltDown(), isAltGraphDown(), isControlDown() a isShiftDown(), ktoré vracajú logickú hodnotu v závislosti od toho, či je daný modifikátorový kláves stlačený (true) alebo nestlačený (false).

Ďalším poslucháčom udalostí myši, ktorému sa budeme venovať, je MouseMotionListener. Ako už názov napovedá, slúži na zachytávanie udalostí súvisiacich s pohybom myši v oblasti plochy komponentu. Toto rozhranie deklaruje dve metódy:

mouseDragged() – metóda volaná v prípade, že používateľ stlačí tlačidlo nad plochou komponentu a následne pohybuje myšou nad plochou komponentu,

mouseMoved() – metóda volaná pri pohybe myšou nad plochou komponentu, ale bez stlačených tlačidiel.

Obom metódam v tomto rozhraní je opäť odovzdávaný ako parameter odkaz na inštanciu triedy MouseEvent, o ktorej sme sa už zmienili.

V prípade, že budete chcieť implementovať vo vašich aplikáciách obe rozhrania (MouseMotionListener aj MouseListener), môžete použiť poslucháča MouseInputListener, ktorý je odvodený od oboch týchto rozhraní, čo znamená, že jeho implementáciou implementujete obe spomínané rozhrania.

Iste sa občas stretnete so situáciou, keď budete potrebovať obslúžiť len niektoré udalosti myši, napr. iba kliknutie, teda chcete implementovať len metódu mouseClicked() z rozhrania MouseListener, pričom ostatné štyri metódy vás nezaujímajú. Keďže však potrebujete inštanciovať triedu implementujúcu toto rozhranie, nesmie mať táto trieda žiadne metódy bez implementácie (abstraktné metódy). Preto musíte implementovať aj zvyšné štyri metódy, aj keď pôjde len o prázdnu implementáciu, teda v ich telách nebude vykonávané nič. Práve v tomto prípade nám poslúžia tzv. adaptéry. Adaptéry sú konkrétne triedy implementujúce nejaké rozhranie, pričom tieto triedy poskytujú prázdne implementácie metód implementovaného rozhrania. To znamená, že namiesto toho, aby sme vo svojej triede implementovali žiadané rozhranie, odvodíme ju od príslušného adaptéra a prekryjeme žiadanú metódu (alebo metódy) vlastnou implementáciou, zatiaľ čo ostatné metódy zostanú s pôvodnými prázdnymi implementáciami adaptéra. Tak docielime požadovanú funkcionalitu bez nutnosti písať prebytočný kód navyše. Takýmito adaptérmi v prípade poslucháčov udalostí myši sú triedy MouseAdapter (pre rozhranie MouseListener), MouseMotionAdapter (pre rozhranie MouseMotionListener) a MouseInputAdapter (pre rozhranie MouseInputListener). Od týchto tried budete teda odvodzovať svoje triedy poslucháčov, ktoré budete chcieť používať vo svojich programoch, samozrejme, len v prípade, že budete chcieť implementovať len niektoré metódy príslušného rozhrania. V opačnom prípade je lepšie priamo implementovať dané rozhranie.

Posledným poslucháčom udalostí myši, ktorému sa budeme venovať, je MouseWheelListener. Tento poslucháč umožňuje obsluhu udalostí súvisiacich s kolieskom myši, ktoré je umiestnené väčšinou na mieste prostredného tlačidla. Toto rozhranie poskytuje iba jedinú metódu:

mouseWheelMoved() – metóda volaná pri akomkoľvek pohybe kolieska myši.

Tejto metóde je odovzdávaný ako parameter odkaz na inštanciu triedy MouseWheelEvent. Pomocou jej metód môžete získať všetky potrebné informácie o vzniknutej udalosti a patrične na ne reagovať vo vašej aplikácii.

Trieda MouseWheelEvent poskytuje metódu getWheelRotation(), ktorá vracia počet „kliknutí“ predstavujúcich otočenie kolieskom. Tento počet je kladný v prípade, že používateľ otočil kolieskom smerom dole, a záporný, pokiaľ otočil kolieskom smerom nahor. Ďalšou dôležitou metódou je getScrollType(), ktorá vráti typ otočenia kolieskom. Tieto typy poznáme dva – otočenie o určitý počet jednotiek alebo otočenie o celý blok. Tieto dva typy sú reprezentované konštantami WHEEL_UNIT_SCROLL a WHEEL_BLOCK_SCROLL, definovanými v triede MouseWheelEvent. V prípade, že používateľ otočil kolieskom iba o niekoľko jednotiek (a teda metóda getScrollType() vráti konštantu WHEEL_UNIT_SCROLL), môžete tento počet jednotiek zistiť metódou getScrollAmount().

Funkcionalita kolieska myši je užitočná hlavne pre komponent JScrollPane, pretože doň môžete zapuzdriť v podstate akýkoľvek iný komponent a následne meniť jeho viditeľnú časť (viewport) pomocou posuvníkov. Pokiaľ by ste chceli implementovať ovládanie týchto posuvníkov pomocou kolieska myši, iste vás poteší, že si túto prácu môžete ušetriť, pretože komponent JScrollPane má už túto funkcionalitu implementovanú.

Udalosti klávesnice

Základnou triedou reprezentujúcou udalosti klávesnice je trieda KeyEvent. Táto trieda je (podobne ako MouseEvent) odvodená od triedy InputEvent. O tom, aké možnosti poskytuje trieda InputEvent, ste sa v tomto článku už mali možnosť dočítať, takže prejdeme priamo k triede KeyEvent. Táto trieda (resp. rozhranie) je zväčša používaná pre inštanciáciu objektov zapuzdrujúcich informácie o udalosti pre poslucháčov typu KeyListener, resp. pre ich metódy. Svojím spôsobom sa veľmi podobá rozhraniu MenuKeyListener, spomínanému na začiatku článku (a ktoré je jeho priamym potomkom). Rozhranie KeyListener definuje takisto tri metódy:

keyPressed() – volaná pri stlačení klávesu,

keyReleased() – volaná pri uvoľnení klávesu,

keyTyped() – volaná pri klepnutí na kláves (teda stlačenie a uvoľnenie).

Ako vidíte, paralela medzi rozhraniami MenuKeyListener a KeyListener a ich metódami je očividná. Ak ste si preštudovali začiatok tohto článku, v podstate už viete používať aj poslucháčov typu KeyListener. Takisto trieda KeyEvent zapuzdrujúca informácie o udalosti, resp. inštancia tejto triedy, je rodičovskou triedou pre MenuKeyEvent. Trieda KeyEvent definuje pre každý kláves vlastnú konštantu s predponou VK_ (teda napr. kláves A má konštantu VK_A, takisto existuje konštanta VK_F5 a podobne, podrobný zoznam získate z dokumentácie). Na získanie číselného kódu stlačeného klávesu je možné použiť metódu getKeyCode(), ktorej návratovú hodnotu môžete porovnať so spomínanými preddefinovanými konštantami. S používaním poslucháčov udalostí vznikajúcich v súvislosti s klávesnicou a ich obsluhou by ste teda nemali mať problémy. Nakoniec sa ešte zmienime o niektorých užitočných metódach triedy KeyEvent. Znakovú reprezentáciu stlačeného klávesu (alebo kombinácie klávesov) môžete získať pomocou metódy getKeyChar() a textový opis stlačeného klávesu (alebo ich kombinácie) zasa metódou getKeyText(). Tieto metódy sú používané napr. v menu, kde sú pri položkách zobrazované ich klávesové akcelerátory (horúce klávesy) v textovom tvare (napr. Ctrl+Alt+H). Vďaka tomu môžete tieto metódy použiť v prípade, že budete musieť implementovať zobrazovanie textového opisu kombinácie klávesov vo vlastnom špecifickom prípade.

Záver

V tejto časti sme sa venovali iba teórii, naučili sme sa, ako obsluhovať udalosti myši a klávesnice, a dokončili sme rozprávanie o komponentoch menu. V nasledujúcej časti si ukážeme príklad, kde využijeme všetky nadobudnuté vedomosti, a začneme sa venovať programovaniu desktopových aplikácií v Jave. Dovtedy dovidenia.

 

 

Autor: Andrej Chu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá