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;
	}

	@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();
	}

代码基本上就这样了,如果有写的不好的地方还请大家多多指出,毕竟本人接触插件开发不久

你可能感兴趣的:(eclipse)