Ohjelmointitekniikka (Java) -materiaalia © Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.

Ohjelmointitekniikka (Java): esimerkkejä tapahtumankäsittelystä

(Muutettu viimeksi 2.2.2004)

Tapahtumankuuntelijaolio voidaan liittää monella erilaisella tavalla käyttöliittymäkomponenttiin. Alla on vain muutama esimerkki.

Käyttöliittymäluokka toteuttaa kuuntelijarajapintaluokan

Käyttöliittymäluokka voi itse toteuttaa kuuntelijarajapintaluokan. Luokan oma ilmentymä annetaan parametrina addMouseListener-metodille. Tapa on ehkä hivenen omituinen, mutta voi olla näppärä pikkuisissa ohjelmissa. (HiiriTuliJaMeni1.java)

import javax.swing.*;
import java.awt.event.*;
import java.awt.font.*;  // vain fonttia varten
import java.awt.*;       //        "

public class HiiriTuliJaMeni1 extends JFrame
                              implements MouseListener {

  private JTextArea alue = new JTextArea (1, 11);
  private int puremia = 0;

  public HiiriTuliJaMeni1() {

    alue.setEditable(false);
    getContentPane().add ("Center", alue);

    alue.setFont(new Font("Serif", Font.BOLD, 20));
    alue.setText(" Hiirtä ei ole näkynyt.");

    alue.addMouseListener(this);  // luokka ITSE toteuttaa
                                  // kuuntelijan
  }

  public void mouseEntered(MouseEvent tapahtuma) {
    alue.setText("      Hiiri tuli!");
  }
   public void mouseExited(MouseEvent tapahtuma) {
    alue.setText("      Hiiri meni!");
  }

  public void mouseClicked(MouseEvent tapahtuma) {
    ++puremia;
    alue.setText(" Hiiri puri! ("+puremia+". kerta)");
  }

  // KAIKKI luvatut metodit on toteutettava (edes tyhjinä):

  public void mousePressed(MouseEvent tapahtuma)  { }
  public void mouseReleased(MouseEvent tapahtuma) { }


 public static void main(String[] args) {
        HiiriTuliJaMeni1 ikkuna = new HiiriTuliJaMeni1();
        ikkuna.setTitle("Hiirielämää");
        ikkuna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ikkuna.pack();
        ikkuna.setVisible(true);
    }
}


Nimetön adapteriluokan aliluokka

Tässä esimerkissä toteutetaan kuuntelijarajapintaluokka nimettömänä adapteriluokan aliluokkana, jonka ilmentymä annetaan parametrina addMouseListener-metodille. (HiiriTuliJaMeni2.java)

import javax.swing.*;
import java.awt.event.*;
import java.awt.font.*;  // vain fonttia varten
import java.awt.*;       //        "

public class HiiriTuliJaMeni2 extends JFrame {

  private JTextArea alue = new JTextArea (1, 11);
  private int puremia = 0;

  public HiiriTuliJaMeni2() {

    alue.setEditable(false);
    getContentPane().add ("Center", alue);
    alue.setFont(new Font("Serif", Font.BOLD, 20));
    alue.setText(" Hiirtä ei ole näkynyt.");

    alue.addMouseListener(  // nimetön sisäluokka MouseAdapterin
      new MouseAdapter() {  // aliluokkana (vain tarpeell. toteut.)

        public void mouseEntered(MouseEvent tapahtuma) {
          alue.setText("      Hiiri tuli!");
        }
        public void mouseExited(MouseEvent tapahtuma) {
          alue.setText("      Hiiri meni!");
        }
        public void mouseClicked(MouseEvent tapahtuma) {
          ++puremia;
          alue.setText(" Hiiri puri! ("+puremia+". kerta)");
        }
      }
    ); 
  }

 public static void main(String[] args) {
        HiiriTuliJaMeni2 ikkuna = new HiiriTuliJaMeni2();
        ikkuna.setTitle("Hiirielämää");
        ikkuna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ikkuna.pack();
        ikkuna.setVisible(true);
    }
}
Toki kuuntelija voitaisiin ohjelmoida myös nimettömänä luokkana, joka suoraan toteuttaa kuuntelijarajapintaluokan (HiiriTuliJaMeni2b.java), mutta tässä ratkaisussa tyhjiksi jäävätkin metodit on toteutettava:
    alue.addMouseListener(  // nimetön sisäluokka MouseListenerin
      new MouseListener() { // toteuttajana

        public void mouseEntered(MouseEvent tapahtuma) {
          alue.setText("      Hiiri tuli!");
        }
        public void mouseExited(MouseEvent tapahtuma) {
          alue.setText("      Hiiri meni!");
        }
        public void mouseClicked(MouseEvent tapahtuma) {
          ++puremia;
          alue.setText(" Hiiri puri! ("+puremia+". kerta)");
        }
        public void mousePressed(MouseEvent tapahtuma)  { }
        public void mouseReleased(MouseEvent tapahtuma) { } 
      }
    ); 
Jos kaikki kuuntelijan metodit joka tapauksessa ohjelmoidaan ei-tyhjiksi algoritmeiksi, rajapintaluokan käyttö adapterin sijaan on perusteltua.

Yksityinen sisäluokka adapterin aliluokkana

Kuuntelijarajapintaluokka voidaan toteuttaa myös nimettynä yksityisenä sisäluokkana, joka on adapteriluokan aliluokka. (HiiriTuliJaMeni3.java)

(Kuten edellisessä esimerkissä, myös tässä voitaisiin rajapintaluokka toteuttaa itsekin.)


import javax.swing.*;
import java.awt.event.*;
import java.awt.font.*;  // vain fonttia varten
import java.awt.*;       //        "

public class HiiriTuliJaMeni3 extends JFrame {

  private JTextArea alue = new JTextArea (1, 11);
  private int puremia = 0;

  public HiiriTuliJaMeni3() {

    alue.setEditable(false);
    getContentPane().add ("Center", alue);
    alue.setFont(new Font("Serif", Font.BOLD, 20));
    alue.setText(" Hiirtä ei ole näkynyt.");

    alue.addMouseListener(new HiirenHuomaaja());
  }

  private class HiirenHuomaaja extends MouseAdapter {

     public void mouseEntered(MouseEvent tapahtuma) {
       alue.setText("      Hiiri tuli!");
     }
     public void mouseExited(MouseEvent tapahtuma) {
       alue.setText("      Hiiri meni!");
     }
     public void mouseClicked(MouseEvent tapahtuma) {
       ++puremia;
       alue.setText(" Hiiri puri! ("+puremia+". kerta)");
     }
   }

  public static void main(String[] args) {
        HiiriTuliJaMeni3 ikkuna = new HiiriTuliJaMeni3();
        ikkuna.setTitle("Hiirielämää");
        ikkuna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ikkuna.pack();
        ikkuna.setVisible(true);
  }
}


Takaisin kurssin sisältösivulle.