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): esimerkki keskitetystä ja hajautetusta tapahtumankäsittelystä

(Muutettu viimeksi 30.1.2006)

Tapahtumien kuuntelu voidaan ohjelmoida keskitetysti tai hajauttaa käyttöliittymäkomponentteihin. Alla on pari pientä esimerkkiä.

Keskitetty

Luokka Keski implementoi rajapintaluokan ActionListener ja siis toteuttaa metodin actionPerformed. Tämä metodi löytää tapahtuman aiheuttajan lauseella
    Object aiheuttaja = tapahtuma.getSource();
(Keski.java)
import javax.swing.*;
import java.awt.event.*;
import java.awt.GridLayout;

public class Keski extends JFrame
                        implements ActionListener {

  // muuttujia ikkunan komponenteille:

  private JButton nappula1, nappula2, nappula3;
  private JTextArea tekstiAlue;
  private int painallusLkm = 0;

  public Keski() {  // konstruktori

    setLayout(new GridLayout(2,3)); 

    // luodaan komponenttioliot:

    nappula1 = new JButton("1");
    nappula2 = new JButton("2");
    nappula3 = new JButton("3");

    tekstiAlue = new JTextArea(" Painele nappuloita!");
    tekstiAlue.setEditable(false);

    // lisätään komponenttioliot ikkunaan:

    add(nappula1);
    add(nappula2);
    add(nappula3);
    add(tekstiAlue);

    // asetetaan kuuntelijat:

    nappula1.addActionListener(this);
    nappula2.addActionListener(this);
    nappula3.addActionListener(this);

  }

  // tapahtumien käsittely keskitetysti:

  public void actionPerformed(ActionEvent tapahtuma) {

     Object aiheuttaja = tapahtuma.getSource();

     if (aiheuttaja == nappula1) {
      ++painallusLkm;
      tekstiAlue.setText(" Painoit nappulaa 1." +
                          "\n Painalluksia "+ painallusLkm+ " kpl.");
     }
     else 
     if (aiheuttaja == nappula2) {
       ++painallusLkm;
       tekstiAlue.setText(" Painoit nappulaa 2." +
                           "\n Painalluksia "+ painallusLkm+ " kpl.");
     }
     else 
     if (aiheuttaja == nappula3) {
       ++painallusLkm;
       tekstiAlue.setText(" Painoit nappulaa 3." +
                           "\n Painalluksia "+ painallusLkm+ " kpl.");
     }
  }

  public static void main(String args[]) {
      Keski ikkuna = new Keski();
      ikkuna.setSize(300, 100);
      ikkuna.setTitle("Keski.java");
      ikkuna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      ikkuna.setVisible(true);
  }
} 

Hajautettu

Luokassa Haja tapahtumankuuntelijat luodaan nimettömän sisäluokan ilmentyminä suoraan addActionListener-metodin todellisina parametreina:
    nappula1.addActionListener(
      new ActionListener() {
        public void actionPerformed(ActionEvent tapahtuma) {
          ...
        }
      }   
      );
(Haja.java).
import javax.swing.*;
import java.awt.event.*;
import java.awt.GridLayout;

public class Haja extends JFrame {

  // muuttujia ikkunan komponenteille:

  private JButton nappula1, nappula2, nappula3;
  private JTextArea tekstiAlue;
  private int painallusLkm = 0;

  public Haja() {  // konstruktori

    setLayout(new GridLayout(2,3)); 

    // luodaan komponenttioliot:

    nappula1 = new JButton("1");
    nappula2 = new JButton("2");
    nappula3 = new JButton("3");

    tekstiAlue = new JTextArea(" Painele nappuloita!");
    tekstiAlue.setEditable(false);

    // lisätään komponenttioliot ikkunaan:

    add(nappula1);
    add(nappula2);
    add(nappula3);
    add(tekstiAlue);

    // luodaan tapahtumiin reagoijat suoraan komponentteihin:

    nappula1.addActionListener(
      new ActionListener() {
        public void actionPerformed(ActionEvent tapahtuma) {
          ++painallusLkm;
          tekstiAlue.setText(" Painoit nappulaa 1." +
                             "\n Painalluksia "+ painallusLkm+ " kpl.");
        }
      }   
      );

    nappula2.addActionListener(
      new ActionListener() {
        public void actionPerformed(ActionEvent tapahtuma) {
          ++painallusLkm;
          tekstiAlue.setText(" Painoit nappulaa 2." +
                             "\n Painalluksia "+ painallusLkm+ " kpl.");
        }
      }
      );

    nappula3.addActionListener(
      new ActionListener() {
        public void actionPerformed(ActionEvent tapahtuma) {
          ++painallusLkm;
          tekstiAlue.setText(" Painoit nappulaa 3." +
                             "\n Painalluksia "+ painallusLkm+ " kpl.");
        }
      }
      );

  }

  public static void main(String args[]) {
      Haja ikkuna = new Haja();
      ikkuna.setSize(300, 100);
      ikkuna.setTitle("Haja.java");
      ikkuna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      ikkuna.setVisible(true);
  }
}