属性事件主要关注属性值的变化所产生的事件。一般都会定义好属性并保存着,只是其值会变化,变化即产生事件,要作相应的处理。应该与点击一个按钮等产生的事件相区别。
如一个属性light(灯),它的值有on和off。。。。
也写了一个例子,与java标准事件机制类似。一个信号灯,红,黄,绿变化着,即当这个信号灯的属性color的值是红则变为红灯,值是黄则变为黄灯,值是绿则变为绿灯。要监听JButton(点击开始才运行,运行后可暂停),又要使灯运行,所以也练习了一下线程。同时也加了一个方向指示。
light.propertyChangeEvent("light", "green");//绿灯亮
light.propertyChangeEvent("light", "red");//红灯亮
light.propertyChangeEvent("light", "yellow");//黄灯亮
package cn.com.cathay.event.LED;
imp
public interface LEDListener extends EventListener
{
public void on
}
package cn.com.cathay.event.LED;
imp
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;
imp
imp
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 >
* 如果属性的值有变化,则调用实现了<co
*/
public void propertyChangeEvent(String propertyName, String newColor)
{
LEDListener Listener = listenerList.get(propertyName);
if ( Listener == null)
{
return;
}
//如果属性有变化,则要调用具体的实现方法on
if (this.oldColor == null || ! this.oldColor.equalsIgnoreCase(newColor))
{
this.oldColor = newColor;
LEDEvent event = new LEDEvent(this,newColor);
Listener.on
}
}
}
package cn.com.cathay.event.LED;
imp
imp
imp
imp
imp
imp
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 on
{
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 on
{
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);
}
}