8. praktikum (Sündmuste töötlemine).  

Teemad

Sündmused. Kuularid. Kasutajaliidese loomine. Graafilised komponendid. 


Peale selle praktikumi läbimist oskab üliõpilane

Javas on kasutajaliidese komponentidega toimuvate sündmuste töötlus kirjeldatud pakettides java.awt.event ja javax.swing.event asuvates liidestes.

Soovides ise defineerida mingit kuularit, peame kõigepealt otsustama, millist tüüpi sündmustele hakkab kuular reageerima. Seejärel koostame kuularit kirjeldava klassi, mis realiseerib vastava sündmusetüübi sündmustele vastavat liidest. Graafilise kasutajaliidese vahendusel toimuvate sündmuste käsitlemiseks enam vajalikud liidesed on:

Näitena kirjeldame kuulariklassi, mis kuulariga seostatud nupu vajutamisel teatab nupu märgendi väärtuse.

import java.awt.event.*;

class Nupukuular implements ActionListener {

  public void actionPerformed(ActionEvent e) {
    System.out.println("Vajutasite nupule " +
                        e.getActionCommand());
  }
}


Kasutajaprogrammis loome kolm nuppu. Nupu seostame klassi
Nupukuular isendiga, kasutades klassi JButton ülemklassi AbstractButton meetodit addActionListener(ActionListener).

import java.awt.*;
import javax.swing.*;
class Nuputest extends JFrame {

  public static void main(String[] args) {
    JFrame raam = new JFrame();
    raam.setTitle("Testime nuppe");
    raam.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton nupp1 = new JButton("Esimene");
    JButton nupp2 = new JButton("Teine");
    JButton nupp3 = new JButton();

    nupp1.addActionListener(new Nupukuular());
    nupp2.addActionListener(new Nupukuular());

    raam.setLayout(new GridLayout(3, 1));

    raam.add(nupp1);
    raam.add(nupp2);
    raam.add(nupp3);

    raam.setSize(500, 200);
    raam.setVisible(true);
  }
}


Graafikaobjekt võib olla ka iseendaga toimuvate sündmuste kuular. Sellisel juhul pole vaja kirjeldada omaette klassi, kõik liideses määratud sündmuste meetodid realiseeritakse samas klassis, kus objekti funktsionaalsuski.

import java.awt.event.*;
import javax.swing.*;

class Aknatest extends JFrame implements WindowListener {

  public static void main(String[] args) {
    Aknatest raam = new Aknatest();
    raam.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    raam.setTitle("Aknaoperatsioonide testimine");
    raam.setSize(100, 80);
    raam.setVisible(true);
  }

  Aknatest() {
    addWindowListener(this);
  }

  public void windowDeiconified(WindowEvent e) {}

  public void windowIconified(WindowEvent e) {
    System.out.println("Aken ikooniks");
  }

  public void windowActivated(WindowEvent e) {
    System.out.println("Aken on fookuses");
  }

  public void windowDeactivated(WindowEvent e) {}

  public void windowOpened(WindowEvent e) {
    System.out.println("Aken avatud");
  }

  public void windowClosing(WindowEvent e) {
    System.out.println("Aken suletud");
  }

  public void windowClosed(WindowEvent e) {}
}


Ülesanne 1

Luua iga järgneva graafikakomponendi jaoks vastavat liidest realiseeriv kuulariklass:

Kirjutada iga sündmuse jaoks mõistlik töötlus. Kirjutada testklass, milles luuakse igast kuulariklassist vähemalt üks isend.

Abiks võib olla juhend.

Mõned lingid videoõpetustele:

http://thenewboston.org/watch.php?cat=31&number=52
http://thenewboston.org/watch.php?cat=31&number=53
http://thenewboston.org/watch.php?cat=31&number=54

Ülesanne 2

Kirjutada programm, milles hiirega nupule liikudes "jookseb" nupp eest ära.

Juhis: Tuleb luua nupu jaoks kuulariklass, mis realiseerib MouseMotionListener liidest. Sõltuvalt sellest, mis suunast tuleb hiir nupule, liigutada nupp (nt. kui hiir tuleb vasakult, siis liigutada nupp paremale). Selleks, et saada teada, mis suunast hiir tuleb nupule, võib kasutada hiire asukoha koordinaadid, kus toimus sündmus (kui muutuja e on MouseEvent tüüpi, siis võib kasutada meetodeid e.getX() ja e.getY()) ning nupu laiust ja kõrgust (kui muutuja e on MouseEvent tüüpi, siis võib kasutada meetodeid e.getComponent().getWidth() ja e.getComponent().getHeight()). Nupu asukoha muutmiseks võib kasutada meetodit e.getComponent().setLocation(x,y), kus e on MouseEvent tüüpi ning x ja y on uued täisarvulised koordinaadid.

Ülesanne 3

Kirjutada programm, mis esitab kuni 5 valikvastusega (vaid üks õige / mitu õiget) küsimusi ja annab tagasisidet vastajale.