将gmf图片放在文本之后

前两天一直在看gmf,这两天又看birt,关于gmf的很多东东都忘记了,所以今天又看看想把一些东西写出来,否则以后又得从头开始看了。因为要做一个图形编辑器,里面要有很多图片,而且图片要放在文本后面,比如一个html编辑器就需要有个文本框,而在文本框前面应该有文本信息,比如“姓名”。而在gmf中通过emf自动生成的都是先显示图片后显示文本,下了很多功夫也没研究出什么好方法,但还是对付实现了。默认情况下与editpart对应的figure是WrappingLabel,看一下它的paintFigure方法:
    public void paintFigure(Graphics graphics) {
        super.paintFigure(graphics);

        if (hasIcons()) {
            paintIcons(graphics);
        }
    }

这里paintIcons方法就是绘制前面小图标的方法,所以这里需要一个类继承WrappingLabel类,重写paintFigure方法,主要就是不让它调用paintIcons方法,因为paintIcons方法是私有的,所以不能重写它,只能重写paintFigure方法,把这个类取名MyWrappingLabel,实现如下:


public class MyWrappingLabel extends WrappingLabel{

    public void paintFigure(Graphics graphics) {
        if (isOpaque())
            graphics.fillRectangle(getBounds());
        if (getBorder() instanceof AbstractBackground)
            ((AbstractBackground) getBorder()).paintBackground(this, graphics, NO_INSETS);
    }
    public MyWrappingLabel() {
        super();
//        ToolbarLayout tbl = new ToolbarLayout();
//        tbl.setVertical(false);
//        this.setLayoutManager(tbl);
    }

}
还需要在editpart里做相应的修改,因为上面只是把文本前面的图标去掉了,我们还要在文本后面加上我们想要的图标,这里我假设与editpart对应的figure类为CodeFigure,则gmf自动生成的代码类似如下:

    public class CodeFigure extends RectangleFigure {

        /**
         * @generated
         */
        private WrappingLabel fFigureCodeLabelFigure;

        /**
         * @generated
         */
        public CodeFigure() {

            FlowLayout layoutThis = new FlowLayout();
            layoutThis.setStretchMinorAxis(false);
            layoutThis.setMinorAlignment(FlowLayout.ALIGN_LEFTTOP);

            layoutThis.setMajorAlignment(FlowLayout.ALIGN_LEFTTOP);
            layoutThis.setMajorSpacing(5);
            layoutThis.setMinorSpacing(5);
            layoutThis.setHorizontal(true);

            this.setLayoutManager(layoutThis);

            createContents();
        }

        /**
         * @generated
         */
        private void createContents() {

            fFigureCodeLabelFigure = new WrappingLabel();
            fFigureCodeLabelFigure.setText("<...>");

            this.add(fFigureCodeLabelFigure);

        }

........等这里没有全贴出来,因为只需要在构造函数和createContents方法里做些手脚就可以搞定了

    public class CodeFigure extends RectangleFigure {

        /**
         * @generated
         */
        private WrappingLabel fFigureCodeLabelFigure;

        /**
         * @generated not
         */
        public CodeFigure() {
            GridLayout layout = new GridLayout(2, false);
            setLayoutManager(layout);
            createContents();
        }

        /**
         * @generated not
         */
        private void createContents() {

            fFigureCodeLabelFigure = new MyWrappingLabel();
            fFigureCodeLabelFigure.setText("aaaaaaaa");

            add(fFigureCodeLabelFigure, new GridData(SWT.BEGINNING,
                    SWT.BEGINNING, false, false, 1, 1));
            add(new ImageFigure(getImage()), new GridData(SWT.BEGINNING,
                    SWT.BEGINNING, false, false, 1, 1));
        }

        private Image getImage() {
            return getImageImage("icons/full/obj16/Code.gif "); //$NON-NLS-1$
        }

        protected Image getImageImage(String path) {
            Image image = JFaceResources.getImageRegistry().get(path);
            if (image == null) {
                ImageDescriptor descriptor = AbstractUIPlugin
                        .imageDescriptorFromPlugin("myemf.edit ", path); //$NON-NLS-1$
                if (descriptor == null) {
                    descriptor = ImageDescriptor.getMissingImageDescriptor();
                }
                JFaceResources.getImageRegistry().put(path,
                        image = descriptor.createImage());
            }
            return image;
        }

红色的地方是需要注意的地方,比如generated not, 比如原来是generated,如果不改动,则在下次从emf生成gmf的时候则会把修改的东西覆盖掉,而myemf.edit 是你存放图片的插件的名称(确切的说是插件id),而icons/full/obj16/Code.gif 是图片在相应插件下的相对路径。

好了小功告成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值