如果有需求要将Composite的边框颜色改成红色,大家肯定就想到用GC了,先给Composite添加Apaint监听这里我将这种方法称之为一,然后再实现重绘的方法,或者是直接GC gc = new GC(Composite)然后直接画了,将这种方法称之为二,那么我现在就来说说方法二法有什么问题,大家也可以做实验,搞个composite 添加双击事件 双击之后改变机框,相信大家都知道怎么写,然后最小化界面,在打开,大家可以发现颜色没了,这就说明这个方法是临时性的,你要想永久存在,还是得用监听;好的,那么大家现在将方法二换成方法一试试:完全可以实现,那么在原有的基础上在加一个Composite调用同一个改变边框颜色的方法试试,大家就会发现了,双击了某一个,这个Composite的边框颜色确实是变了,但是在双击另一个的时候就没反应了,这是为什么呢?这就是监听的慢哇,那么究竟是什么原因造成这种问题的呢?其实大家仔细想想就知道了,addPaintListener顾名思义,就是添加paint监听,每双击一次就添加一次,这样就会出现那种情况了,那么怎么样保证只添加一次呢?那就是添加之前删除引用;下面就给大家说说我遇到的实际情况吧:项目需求中需要根据一些值决定Composite的边框颜色,所以只用现有的PaintListener接口是不行的,所以我写了个MyPaintListener extends PaintListener代码如下:
代码基本上就这样了,如果有写的不好的地方还请大家多多指出,毕竟本人接触插件开发不久
package com.netunit.workbench.listeners;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
public class MYPaintListener implements PaintListener {
private Color color = null;
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
@Override
public void paintControl(PaintEvent e) {
GC gc = e.gc;
gc.setForeground(color);
gc.drawRectangle(e.x, e.y, e.width - 1, e.height - 1);
gc = null;
}
}
MYPaintListener listener = new MYPaintListener();
FlashGot.setBorderColorWithApaint(listener, container, color);
/**
* 更改控件边框颜色
*
* @param control
* @param color
*/
public static void setBorderColorWithApaint(MYPaintListener listener, Control control, final Color color) {
control.removePaintListener(listener);
listener.setColor(color);
control.addPaintListener(listener);
control.redraw();
}
代码基本上就这样了,如果有写的不好的地方还请大家多多指出,毕竟本人接触插件开发不久