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

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【josemourinho】截止到2008-06-26 17:49:34的历史汇总数据(不包括此帖):
    发帖数:15                 发帖分:520                
    结贴数:9                  结贴分:360                
    未结数:6                  未结分:160                
    结贴率:60.00 %            结分率:69.23 %            
    楼主加油
      

  2.   

    可以考虑在将CTabFolder添加到Composite中,判断当CTabFolder的所有item全部被关闭时将其隐藏(setVisible(false)),这时在最上面的应该就是Composite,所以接下来的问题就是在Composite上显示图片了,这个好办,下面的ImageComposite可拿去用。
    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;
                    }
                }
            }
        }
    }
      

  3.   

    这种方法也行,但当我把所有item都关掉之后调用getItemCount()函数显示的还有一项item,是不是CTabFolder里有一项默认的item啊?但看api中好像又没提到。
      

  4.   


    可能是你没关完,我刚才测试了,全部关完的时候getItemCount()返回0