java属性变化事件机制(1)

         属性事件主要关注属性值的变化所产生的事件。一般都会定义好属性并保存着,只是其值会变化,变化即产生事件,要作相应的处理。应该与点击一个按钮等产生的事件相区别。
  如一个属性light(灯),它的值有on和off。。。。

  也写了一个例子,与java标准事件机制类似。一个信号灯,红,黄,绿变化着,即当这个信号灯的属性color的值是红则变为红灯,值是黄则变为黄灯,值是绿则变为绿灯。要监听JButton(点击开始才运行,运行后可暂停),又要使灯运行,所以也练习了一下线程。同时也加了一个方向指示。
  light.propertyChangeEvent("light", "green");//绿灯亮

  light.propertyChangeEvent("light", "red");//红灯亮

  light.propertyChangeEvent("light", "yellow");//黄灯亮
  


package cn.com.cathay.event.LED;

import java.util.EventListener;

public interface LEDListener extends EventListener
{
    public void onStatusChange(LEDEvent event);

}


package cn.com.cathay.event.LED;

import java.util.EventObject;

public class LEDEvent extends EventObject
{
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private String color = null;
   
    public LEDEvent(Object source, String color)
    {
        super(source);
        this.color = color;
    }

    /**
     * @return the color
     */
    public String getColor() {
        return color;
    }

    /**
     * @param color the color to set
     */
    public void setColor(String color) {
        this.color = color;
    }
}

package cn.com.cathay.event.LED;

import java.util.HashMap;

import javax.swing.JButton;

public class LED extends JButton
{
    private static HashMap<String, LEDListener> listenerList = null;
   
    private String oldColor = null;
   
    public LED()
    {       
    }
   
    //增加事件
    public void addLEDListener(String propertyName, LEDListener listener)
    {
        if (listenerList == null)
        {
            listenerList = new HashMap<String, LEDListener>();
        }
       
        listenerList.put(propertyName,listener);       
    }
   
    //移除事件
    public void removeLEDListener(String propertyName)
    {
        if (listenerList == null)
        {
            return;
        }
        else
        {
            listenerList.remove(propertyName);
        }
    }
   
    /**
     * 响应事件.<br >
     * 如果属性的值有变化,则调用实现了<code>LEDListener</code>接口的类的onStatusChange方法。
     */
    public void propertyChangeEvent(String propertyName, String newColor)
    {
        LEDListener Listener = listenerList.get(propertyName);
        if ( Listener == null)
        {
            return;
        }       
       
        //如果属性有变化,则要调用具体的实现方法onStatusChange()
        if (this.oldColor == null || ! this.oldColor.equalsIgnoreCase(newColor))
        {
            this.oldColor = newColor;
            LEDEvent event = new LEDEvent(this,newColor);
            Listener.onStatusChange(event);
        }       
    }
   
}


package cn.com.cathay.event.LED;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class LEDPanel extends JFrame
{
    /** 信号灯 */
    private LED light;
   
    /** 方向指示灯 */
    private LED way;
   
    /** 控制按钮 */
    private JButton operator;
   
    /** 是否运行。 true:运行  false:暂停 */
    private boolean loop;
   
    /** 同步信号*/
    private Object lock = new Object();
   
    /** 工作线程 */
    private Worker worker = null;
   
    public LEDPanel()
    {
        //设置主面板属性
        setTitle("交通信号灯");
        setLayout(new GridLayout(3,1));
        setSize(50,200);
       
        light = new LED();
        way = new LED();
        operator = new JButton("start");
       
        //注册事件
        light.addLEDListener("light", new MyLedListener());
        way.addLEDListener("way", new MyWayListener());
        operator.addActionListener(new myButtonListener());
       
        //将按钮加到主面板
        add(light);
        add(way);
        add(operator);
   
        setVisible(true);
       
        startWork();
    }
   
    /**
     * start work
     */
    public void startWork()
    {
        worker = new Worker();
        worker.start();
    }
   
    /**
     * 运行信号灯。控制灯亮的时间,顺序
     */
    public void change()
    {
        redOn(2000l);
       
        greenOn(2000l);
       
        yellowOn(2000l);
    }
   

    /**
     * 红灯亮
     * @param time 控制灯亮的时间,单位为mm
     */

    public void redOn(long time)
    {
        light.propertyChangeEvent("light", "red");
        way.propertyChangeEvent("way", "red");
       
        try
        {
            Thread.sleep(time);
            if (loop == false)
            {
                lock.wait();
            }
           
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
   
    /**
     * 绿灯亮
     * @param time 控制灯亮的时间,单位为mm
     */
    public void greenOn(long time)
    {
        light.propertyChangeEvent("light", "green");
        way.propertyChangeEvent("way", "green");
       
        try
        {
            Thread.sleep(time);
            if (loop == false)
            {
                lock.wait();
            }
           
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 黄灯亮
     * @param time 控制灯亮的时间,单位为mm
     */
    public void yellowOn(long time)
    {
        light.propertyChangeEvent("light", "yellow");
        way.propertyChangeEvent("way", "yellow");
       
        try
        {
            Thread.sleep(time);
            if (loop == false)
            {
                lock.wait();
            }
           
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }


    //LED灯属性变化监听事件
    public class MyLedListener implements LEDListener
    {
        public void onStatusChange(LEDEvent event)
        {
            LED led = (LED)event.getSource();
           
            if ("red".equalsIgnoreCase(event.getColor()))
            {
                led.setBackground(Color.red);
            }
            else if ("green".equalsIgnoreCase(event.getColor()))
            {
                led.setBackground(Color.green);
            }
            else if ("yellow".equalsIgnoreCase(event.getColor()))
            {
                led.setBackground(Color.yellow);
            }
            else
            {
                led.setBackground(Color.LIGHT_GRAY);
            }
           
        }
    }
   
    //方向指示灯事件
    public class MyWayListener implements LEDListener
    {
        public void onStatusChange(LEDEvent event)
        {
            LED led = (LED)event.getSource();
           
            if ("red".equalsIgnoreCase(event.getColor()))
            {
                led.setText("→");
                led.setForeground(Color.green);
            }
            else if ("green".equalsIgnoreCase(event.getColor()))
            {
                led.setText("↑");
                led.setForeground(Color.green);
            }
            else if ("yellow".equalsIgnoreCase(event.getColor()))
            {
                led.setText("←");
                led.setForeground(Color.green);
            }
            else
            {
                led.setBackground(Color.LIGHT_GRAY);
            }
        }
    }

   
    //Button的监听事件
    public class myButtonListener implements ActionListener
    {
        JButton led;
       
        public void actionPerformed(ActionEvent event)
        {
            led = (JButton)event.getSource();
           
            try
            {   
                if ("start".equals(led.getText()))
                {   
                    synchronized (lock)
                    {
                        loop = true;
                        led.setText("stop");
                        lock.notify();  //唤醒,开始灯亮
                    }               
                }
                else
                {
                    led.setText("start");
                    loop = false;
                }
            } catch (Exception e)
            {               
                e.printStackTrace();
            }
           
        }
    }
   
    /**
     * 工作线程类,使灯亮的线程
     */
    public class Worker extends Thread
    {
        public void run()
        {
            try
            {
                synchronized (lock)
                {
                    lock.wait();//线程一开始不要运行,点击start按钮才开始。
                   
                    while (true)
                    {               
                        change();
                    }
                }               
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }          
        }
    }
   
   
    public static void main(String[] args)
    {
        JFrame f = new LEDPanel();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章