Java

Schemat działania Eventów w Javie

  • 2010-06-15 13:19
  • 0 komentarzy
  • 2887 odsłon
  • Oceń ten tekst jako pierwszy
Witam, w dzisiejszym artykule zajmiemy się poznaniem schematu delegacyjnego modelu zdarzeń w Javie. Poznamy czym jest Event oraz zaimplementujemy własny EventGenerator(generator zdarzeń).

Tak więc, zdarzenie(nasz Event) w Javie jest niczym innym jak obiektem. Obiektem dzięki któremu będziemy mogli przeprowadzać zmiany na innych obiektach, komunikować sie z nimi, wyciągać z nich informacje, a także ustawiać ich tryby funkcjonowania. Eventy w Javie bardzo często wykorzystywane są w programowaniu sieciowym, gier oraz aplikacjach serwerowych.

Aby przybliżyć Wam ideę funckjonowania zdarzeń postaram się wytłumaczyć to na przykładzie firmy. Załóżmy, że nasz Event Generator będzie szefem, który tworzy naszych pracowników(nasze Eventy), które będą posiadały numer towaru jaki będą rozprowadzać. Klientami naszej firmy będą Panele(z Frame-awt), które będą przyjmowały wysłanników szefa do domu i będą kupować ich towar pod warunkiem że ich numer mieszkania dzieli się bez reszty przez numer towaru jaki zaoferuje im pracownik(nasz Event).
Mózgiem całej tej operacji będzie EventGenerator(nasz szef), który będzie katalogował swoich klientów w zeszycie(naszym Vectorze).

Przyjrzyjmy się graficznemu przedstawieniu naszej sytuacji:



Teraz z przykładowej terminologii przyjrzyjmy się temu problemowi od strony realizacyjnej.
1. Nasz Event Generator będzie miał w sobie Vector, do którego dzięki funkcjom addPanel() będziemy dodawać Panele do katalogu.
2. Event Generator po wywołaniu konstruktora będzie uruchamiał wątek w którym to będzie tworzył Eventy i wysyłał je do Paneli(zebranych w wektorze).
3. Nasze Panele będą posiadały funkcję compare() dzięki której będą mogły porównać czy nr z Eventa dzieli sie bez reszty przez nr jaki posiada nasz Panel.
4. Nasz Event będzie posiadał funkcję getValue() dzięki której Panel będzie mógł wyciągnąć wartość z Eventa.
5. Aby zobaczyć jak wizualnie funkcjonuje nasz program ustalmy że jeżeli nasz Panel dzieli się bez reszty przez wartość z Eventa to zmieniamy kolor Panelu.


Tak więc przystąpmy do kodu:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
 
        public class evt
                extends Frame{
                                public static void main(String[]args){                         
                                        new evt();
                                }
 
                                public evt(){
 
                                setResizable(false);
 
                                setVisible(true);
                                setSize(600,400);
                                setLayout(null);
 
                                Panele a= new Panele(6);
                                a.setLocation(250,100);
                                a.setSize(100,30);
                                a.setBackground(Color.black);
                                add(a);
 
                                Panele v= new Panele(8);
                                v.setLocation(250,150);
                                v.setSize(100,30);
                                v.setBackground(Color.red);
                                add(v);
 
                                Panele b= new Panele(12);
                                b.setLocation(250,200);
                                b.setSize(100,30);
                                b.setBackground(Color.yellow);
                                add(b);
 
                                Panele z= new Panele(4);
                                z.setLocation(250,250);
                                z.setSize(100,30);
                                z.setBackground(Color.blue);
                                add(z);
 
                                Panele w= new Panele(49);
                                w.setLocation(250,300);
                                w.setSize(100,30);
                                w.setBackground(Color.gray);
                                add(w);
 
                                EventG r=new EventG();      
                                r.addevt(a);
                                r.addevt(v);
                                r.addevt(b);
                                r.addevt(z);
                                r.addevt(w);
 
 
                        }
                        public void paint(Graphics g){
                                g.drawString("Mój event Generator :)",240,70);
                        }
                }
 
                class Panele
                        extends Panel{
                                int wrt;
                                public Panele(int wrt){
                                        this.wrt=wrt;
                                }
                                public void odpowiedz(MyEvents eve){
                                        if(eve.getV()%wrt==0){
                                                this.setBackground(new Color(
                                                (int)(Math.random()*255) ,
                                                (int)(Math.random()*255) ,
                                                (int)(Math.random()*255)));
                                        }
                                }
                }
 
                class MyEvents
                        extends EventObject{
                        int id;
                                public MyEvents(int d, Object source){
                                        super(source);
                                        this.id=id;
                                }
 
                        public int getV(){
                                return id;
                        }
 
                }
 
                class EventG
                        implements Runnable{
                        Vector tab;
                        public EventG(){
                                tab=new Vector();
                                try{
                                        new Thread(this).start();
                                }catch(Exception ex){
                                                System.out.println(ex);
                                                }
                        }
 
                        public void addevt(Panele mp){
                                tab.add(mp);
                        }
 
                        public void rmv(Panele mp){
                                tab.remove(mp);
                        }
 
                        public void run(){
                                int id=0;
                                while(true){
                                        MyEvents p=new MyEvents(id,this);
                                        for(int i=0; i<tab.size();i++){
                                                ((Panele)tab.elementAt(i)).odpowiedz(p);
                                        }
                                        id++;
                                        try{
                                                Thread.sleep(100);
                                        }catch(Exception ex){
                                                System.out.println(ex);
                                                }
                                }
                        }
                }


Czyż nie proste? Oto wynik i zmieniające się kolory paneli: