为使ColorButton组件更易于使用,可考虑增加一个颜色更改事件,当按钮颜色改变时,将触发颜色更改事件。这也算是Observer设计模式的一个应用吧。
具体方法如下:
1定义事件类ColorChangedEvent
public class ColorChangedEvent extends EventObject {
private RGB currentRgb = null;//保存当前的颜色RGB
public ColorChangedEvent(Object source, RGB rgb) {
super(source);
this.currentRgb = rgb;
}
public RGB getRgb() {
return currentRgb;
}
public String getHexColor() {
return rgbToHex(currentRgb);
}
}
2定义监听器类ColorChangedListener
public interface ColorChangedListener {
public void colorChanged(ColorChangedEvent event);
}
3在ColorButton中增加保存监听器的List
public class ColorButton {
private List listeners = new ArrayList();
private Button button;
private RGB currentRgb; //保存按钮当前的颜色RGB
public void addColorChangedListener(ColorChangedListeners arg0) {
listeners.add(arg0);
}
public void removeColorChangedListener(ColorChangedListeners arg0) {
listeners.remove(arg0);
}
...
}
4在按钮当前颜色改变时,更新当前颜色RGB,并触发监听器调用colorChanged方法
public class ColorButton {
...
void setImage(Image arg0, Color background, Color foreground) {
drawImage(arg0, background, foreground);
Image img = button.getImage();
if(img != null) {
img.dispose();
}
button.setImage(arg0);
if(currentRgb == null || !currentRgb.equals(background.getRGB())) {
currentRgb = background.getRGB();
notifyObservers();
}
}
private void notifyObservers() {
int size = listeners.size();
for(int i=0; i<size; i++) {
ColorChangedListener listener = (ColorChangedListener)listeners.get(i);
ColorChangedEvent event = new ColorChangedEvent(this, currentRgb);
listener.colorChanged(event);
}
}
...
}
控件可按如下方法来使用ColorChangedListener
colorBtn.addColorChangedListener(new ColorChangedListener() {
@Override
public void colorChanged(ColorChangedEvent event) {
ColorButton cb = (ColorButton)event.getSource();
RGB rgb = event.getRgb();
...
}
});