Java applety - interakcia s používateľom

Z Kiwiki
Verzia z 20:46, 18. november 2010, ktorú vytvoril Juraj (diskusia | príspevky) (Vytvorená stránka „{{Navigacne menu - java}} V tejto časti bude ukázaný spôsob ako do apppletu pridať funkcionalitu, ktorá zabezpečí interakciu s používateľom. Náš applet bude r…“)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Skočit na navigaci Skočit na vyhledávání

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.

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:

Rozhranie MouseListener
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)
Vybrané metódy triedy MouseEvent
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

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)

MouseMotionListener

Udalosti vyvolané klávesnicou