SWT GC重绘心得
如果有需求要将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;}@Overridepublic 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();}