Java applety - interakcia s používateľom
Základy informatiky - jazyk Java
Úvod do programovania v jazyku Java
Java - objektovo orientovaný prístup
Vzorové príklady:
- >Java applety - základná práca
>Java applety - interakcia s používateľom
>Java applety - fraktály
>Java applety - animácia
>Java applety - animácie bez blikania
Java - implementácia numerických algoritmov
Java - triedy geometrických tvarov
Pokročilé témy:
V tejto časti bude ukázaný spôsob ako do apppletu pridať funkcionalitu, ktorá zabezpečí interakciu s používateľom. Náš applet bude reagovať na udalosti spôsobené stlačením klávesy, poklikaním alebo iba prechodom myši nad applet.
Obsah
Udalosti vyvolané "myšou"
Pre začlenenie funkčnosti interakcie s používateľom treba do appletu pridať odkaz na triedu, ktorá toto zabezpečuje. Implementovanie doplnkovej funkcionality programu (appletu) sa v Jave robí pomocou mechanizmu rozhraní. Pre prácu s myšou existujú 2 rozhrania:
- MouseListener
- MouseMotionListener
Pred samotným použitím udalostí treba definovať, ktoré použité komponenty budú schopné udalosti zachytiť. V našom prípade to bude objekt Applet.
MouseListener
Metódy triedy MouseListener sú nasledujúce:
Metóda | Opis |
---|---|
mouseClicked(MouseEvent) | Metóda sa zavolá po kliknutí |
mouseEntered(MouseEvent) | Metóda sa zavolá keď kurzor prejde nad komponent |
mouseExited(MouseEvent) | Metóda sa zavolá keď kurzor opustí oblasť komponentu |
mousePressed(MouseEvent) | Metóda sa zavolá keď sa stačí tlačidlo myši nad objektom |
mouseReleased(MouseEvent) | Metóda sa zavolá keď sa pustí tlačidlo myši, ktoré bolo pred tým stlačené (nad komponentom) |
Metóda | Opis |
---|---|
int getX()
int getY() Point getPoint() |
Vráti pozícu (x,y) na ktorej nastala udalosť. Pozícia je relatívna k oblasti komponentu, na ktotom udalosť vznikla. |
int getButton() | Vráti informáciu o tom, ktoré tlačidlo bolo stlačené. Ako návratová hodnota sú použité konštanty: NOBUTTON, BUTTON1, BUTTON2, alebo BUTTON3. |
Ak chceme v našom applete použiť rozhranie MouseListener, musíme implementovať všetky jej metódy. V nasledujúcom kóde je prázdy applet, ktorý implementuje rozhranie MouseListener:
import java.applet.Applet;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Graphics;
public class Udalost1 extends Applet implements MouseListener {
public void init() {
addMouseListener(this);
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void paint(Graphics g){
}
}
Zápis addMouseListener(this); v metóde init spôsobí, že applet bude reagovať na udalosti myši. Bez tohoto riadku by udalosti neboli zachytené.
Úloha 1.1: Do appletu implementujte funkcionalitu rozhrania MouseListener:
- Keď sa stlačí tlačidlo myši, v danom mieste nakreslite obdĺžnik
- Keď sa uvoľní tlačidlo myši, v danom mieste, kde sa tlačidlo pustilo nakreslite kruh
- Keď sa klikne na applet, nakreslite plný kruh.
Analýza úlohy
Ako prvé treba povedať rozdiel medzi kliknutím a stlačením a pustením tlačítka myši:
- Kliknutie je akcia, pri ktorej sa stlačí tlačidlo myši a následne sa pustí. Medzi týmito dvoma akciami sa nemôže myš pohnúť.
- Ak sa medzi týmito akciami myš pohne, udalosť mouseClick nenastane.
Úlohou je nakresliť geometrický tvar (kruh, obdĺžnik) tam, kde sa klikne. Na to si vytvoríme premenné (x, y) v triede appletu. Aby sme rozlíšili, kedy je tlačidlo myši stlačené a kedy nie je stlačené, pridáme booleovskú premennú stlacene. Premenná bude nadobúdať hodnotu true vtedy, ak bude tlačidlo myši stlačené. V opačnom prípade bude mať hodnotu false. Pre zistenie, kedy sme na applet klikli použijeme pomocnú premennú kliknute. Tá bude mať hodnotu true len v tom prípade, ak nastala udalosť mouseClicked.
Samotné vykresľovanie sa sa bude diať iba v metóde paint, avšak nastavovanie premenných x, y bude v metódach, ktoré obsluhujú zachytené udalosti.
Riešenie:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Udalost1 extends Applet implements MouseListener {
public int x, y;
boolean stlacene;
boolean kliknute;
public void init() {
addMouseListener(this);
this.x = 0;
this.y = 0;
this.stlacene = false;
this.kliknute = false;
}
public void mouseClicked(MouseEvent e) {
this.kliknute = true;
repaint();
}
public void mousePressed(MouseEvent e) {
this.x = e.getX();
this.y = e.getY();
this.stlacene = true;
repaint();
}
public void mouseReleased(MouseEvent e) {
this.x = e.getX();
this.y = e.getY();
this.stlacene = false;
repaint();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void paint(Graphics g) {
if (this.kliknute) {
g.fillOval(x, y, 10, 20);
} else {
if (this.stlacene) {
g.drawRect(x, y, 20, 10);
} else {
g.drawOval(x, y, 20, 20);
}
}
this.kliknute = false;
}
}
Vysvetlenie programu:
Metóda paint
- Ak sa zistí, že používateľ klikol, tak sa vykreslí plný kruh
- V opačnom prípade zisťujeme, či sa jedná o stlačenie tlačidla myši, alebo o jeho pustenie.
- Ak sa jedná o stlačenie (this.stlacene=true) vykreslí sa obdĺžnik.
- V opačnom prípade sa vykreslí prázdny kruh.
- Po vykreslení nastavíme premennú kliknute na false (očakávame ďalšie kliknutie)
Metóda mouseClicked
- do premennej kliknutie triedy Udalost1 uložíme hodnotu true (ako informáciu o tom, že sme zachytili udalosť kliknutie)
- Pomocou volania metódy repaint() vynútime prekreslenie appletu.
Metóda mousePressed/mouseReleased
- Do premenných x, y uložíme pozíciu kde sme klikli
- Táto pozícia je uložená v samotnej udalosti MouseEvent, ktorá je parametrom metód mousePressed a mouseReleased. V objekte e sú všetky potrebé informácie o tom, kde sme klikli, ktorým tlačidlom sme klikli, ...
- prípad mousePressed - do premennej stlacene nastavíme hodnotu true
- prípad mouseReleased- do premennej stlacene nastavíme hodnotu false
- Pomocou volania metódy repaint() vynútime prekreslenie appletu.
Úloha 1.2:
Zmodifikujte predchádzajúci príklad nasledovne: Pri kliknutí na applet nakreslite elipsu/obdĺžnik podľa nasledujúcich pravidiel
- prvé stlačenie tlačidla myši bude určovať bod, z ktorého začneme kresliť
- pri uvoľnení tlačidla myši zistíme druhý bod
- Tieto dva body vymedzujú oblasť kde sa bude vykresľovať elipsa/obdĺžnik
- Ak bude budeme stláčať ľavé tlačítko, nakreslíme obdĺžnik
- Ak bude budeme stláčať pravé tlačítko, nakreslíme elipsu
- Tieto dva body vymedzujú oblasť kde sa bude vykresľovať elipsa/obdĺžnik
Analýza:
Zadeklarujme si 2 body A a B. Použijeme na to triedu Point (z balíčka java.awt.Point). Hodnoty bodu A naplníme, keď stlačíme tlačidlo myši a hodnoty bodu B naplníme keď pustíme tlačidlo myši.
Riešenie:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Udalost1 extends Applet implements MouseListener {
boolean tlacidlo;
Point A, B;
public void init() {
A = new Point();
B = new Point();
addMouseListener(this);
this.tlacidlo = false;
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
this.A.x = e.getX();
this.A.y = e.getY();
if(e.getButton() == MouseEvent.BUTTON1)
this.tlacidlo = true;
else
this.tlacidlo = false;
}
public void mouseReleased(MouseEvent e) {
this.B.x = e.getX();
this.B.y = e.getY();
repaint();
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void paint(Graphics g) {
int sirka, vyska;
sirka = this.B.x - this.A.x;
vyska = this.B.y - this.A.y;
if (this.tlacidlo) {
g.drawRect(this.A.x, this.A.y, sirka, vyska);
} else {
g.drawOval(this.A.x, this.A.y, sirka, vyska);
}
}
}
Vysvetlenie: V metóde mousePressed treba určiť, ktoré tlačidlo bolo stlačené. Informáciu o stlačenom tlačidle je v objekte e (e.getButton()). Túto hodnotu porovnávame s konštantami definovanými v triede MouseEvent. Konštanty sú MouseEvent.BUTTON1, MouseEvent.BUTTON2 a MouseEvent.BUTTON3. Podľa toho, ktoré tlačidlo bolo stlačené nastavíme hodnotu premennej tlacidlo na true alebo false. Túto hodnotu si následne prečítame pri vykresľovaní (metóda paint). Všimnime si, že pri udalosti stlačenia tlačidla myši nepožiadame o prekreslenie. O prekreslenie požiadame až po uvoľnení tlačidla (mouseReleased)