读书人

swt 中CTabFolder有关问题

发布时间: 2012-07-15 20:20:06 作者: rapoo

swt 中CTabFolder问题
我的CTabFolder是这种样式SWT.CLOSE|SWT.BORDER|SWT.V_SCROLL,当我关闭了其中的所有CTabItem之后显示是一片空白,但是我想显示的是一幅背景图片,该怎么添加呢?

[解决办法]
可以考虑在将CTabFolder添加到Composite中,判断当CTabFolder的所有item全部被关闭时将其隐藏(setVisible(false)),这时在最上面的应该就是Composite,所以接下来的问题就是在Composite上显示图片了,这个好办,下面的ImageComposite可拿去用。

Java code
import org.eclipse.swt.events.PaintEvent;import org.eclipse.swt.events.PaintListener;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.graphics.ImageData;import org.eclipse.swt.widgets.Composite;/** * 可设置背景图片的Composite * Composite本身是可以设置背景图片的,但是只提供了平铺的显示方式,该类实现了居中、平铺和拉伸三种显示方式。 *  * @author 003 */public class ImageComposite extends Composite{    /**     * 居中     */    public static final String CENTRE = "Centre";        /**     * 平铺     */    public static final String TILED = "Tiled";    /**     * 拉伸     */    public static final String SCALED = "Scaled";    /**     * 背景图片     */    private Image backgroundImage;        /**     * 背景图片显示模式     */    private String imageDisplayMode;    /**     * 背景图片显示模式索引(引入此属性有助于必要时扩展)     */    private int modeIndex;    /**     * 构造一个没有背景图片的ImageComposite     * @param parent 父组件     * @param style 风格     */    public ImageComposite(Composite parent, int style)    {        this(parent, style, null, CENTRE);    }        /**     * 构造一个具有指定背景图片和指定显示模式的ImageComposite     * @param parent 父组件     * @param style 风格     * @param image 背景图片     * @param modeName 背景图片显示模式     */    public ImageComposite(Composite parent, int style, Image image, String modeName)    {        super(parent, style);        addPaintListener(new PaintListener()        {            @Override            public void paintControl(PaintEvent e)            {                drawImage(e);            }        });        setBackgroundImage(image);        setImageDisplayMode(modeName);    }    /**     * 获取背景图片     * @return 背景图片     * @see org.eclipse.swt.widgets.Control#getBackgroundImage(Image)     */    @Override    public Image getBackgroundImage()    {        return backgroundImage;    }    /**     * 设置背景图片     * @param 背景图片     * @see org.eclipse.swt.widgets.Control#setBackgroundImage(Image)     */    @Override    public void setBackgroundImage(Image backgroundImage)    {        this.backgroundImage = backgroundImage;        this.redraw();    }    /**     * 获取背景图片显示模式     * @return 显示模式     */    public String getImageDisplayMode()    {        return imageDisplayMode;    }    /**     * 设置背景图片显示模式     * @param modeName 模式名称,取值仅限于ImagePane.TILED  ImagePane.SCALED  ImagePane.CENTRE     */    public void setImageDisplayMode(String modeName)    {        if(modeName != null)        {            modeName = modeName.trim();                        //居中            if(modeName.equalsIgnoreCase(CENTRE))            {                this.imageDisplayMode = CENTRE;                modeIndex = 0;            }            //平铺            else if(modeName.equalsIgnoreCase(TILED))            {                this.imageDisplayMode = TILED;                modeIndex = 1;            }            //拉伸            else if(modeName.equalsIgnoreCase(SCALED))            {                this.imageDisplayMode = SCALED;                modeIndex = 2;            }                        this.redraw();        }    }        /**     * 绘制背景     * @param e PaintEvent     */    private void drawImage(PaintEvent e)    {        //如果设置了背景图片则显示        if(backgroundImage != null)        {            int width = this.getSize().x;            int height = this.getSize().y;            int imageWidth = backgroundImage.getImageData().width;            int imageHeight = backgroundImage.getImageData().height;                        switch(modeIndex)            {                //居中                case 0:                {                    int x = (width - imageWidth) / 2;                    int y = (height - imageHeight) / 2;                    e.gc.drawImage(backgroundImage, x, y);                    break;                }                //平铺                case 1:                {                    for(int ix = 0; ix < width; ix += imageWidth)                    {                        for(int iy = 0; iy < height; iy += imageHeight)                        {                            e.gc.drawImage(backgroundImage, ix, iy);                        }                    }                                        break;                }                //拉伸                case 2:                {                    ImageData data = backgroundImage.getImageData().scaledTo(width, height);                    e.gc.drawImage(new Image(e.display, data), 0, 0);                    break;                }            }        }    }} 

读书人网 >J2SE开发

热点推荐