eclipse rcp:复合上的自定义绘图,其FillLayout不起作用

时间:2011-09-28 08:43:35

标签: swt eclipse-rcp jface

我正在尝试添加一个PaintListener来绘制Composite上的顶部边框:

pageComposite.addPaintListener(new PaintListener(){
            @Override
            public void paintControl(PaintEvent e) {
                e.gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
                e.gc.drawLine(0, 0, pageComposite.getBounds().width, 0);
            }

        });

但如果使用 FillLayout 设置 pageComposite ,则不会绘制边框。

Composite c = new Composite(parent, SWT.NONE);
        c.setLayout(new FillLayout());
        new Label(c, SWT.NONE).setText("类方法列表页面,尚未实现");
        return c;

在上面的代码中创建的复合看起来像这样: enter image description here 另一个复合材料有一个FormLayout:

final Composite c = new Composite(parent, SWT.NONE);
        c.setLayout(new FormLayout());
        Label l = new Label(c, SWT.NONE); 
        l.setText("角色用户机构列表页面,尚未实现");

        FormData fd_content = new FormData();
        fd_content.top = new FormAttachment(0, 10);
        fd_content.left = new FormAttachment(0, 10);
        l.setLayoutData(fd_content);
        return c;

enter image description here 我错过了什么吗? 最好的祝福!

1 个答案:

答案 0 :(得分:2)

使用SWT org.eclipse.swt.layout.FillLayout,您的paint event listener 未被调用,这就是您的边框未被绘制的原因。

原因是当你像这样使用FillLayout时:

FillLayout fillLayout = new FillLayout();
composite.setLayout(fillLayout);

然后您没有设置任何其他装饰,例如indentationmargin等,因此您的窗口不会调用操作系统级别update

如果您想使其正常工作,请设置一些其他布局数据,例如marginHeight。例如:

FillLayout fillLayout = new FillLayout();
fillLayout.marginHeight = 5;
composite.setLayout(fillLayout);

这是设置上述布局装饰后的样子(注意顶部边框):

enter image description here

<强> >>Code

我已经添加了一些注释代码。尝试删除评论并查看其行为。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class FillLayoutTest 
{
    public static void main(String[] args) 
    {
        Display display = new Display();
        Shell shell = new Shell(display);

        shell.setLayout(new GridLayout()); shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        final Color c = new Color(display, new RGB(127, 127, 127));

        final Composite composite = new Composite(shell, SWT.NONE);
        FillLayout fillLayout = new FillLayout();
        fillLayout.marginHeight = 5;
        composite.setLayout(fillLayout);
        //composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        new Label(composite, SWT.BORDER).setText("Hello World!!");
        new Label(composite, SWT.BORDER).setText("Hello World Version 2.0!!");

        composite.addPaintListener(new PaintListener(){
            public void paintControl(PaintEvent e) {
                e.gc.setForeground(c);
                e.gc.drawLine(0, 0, composite.getParent().getBounds().width, 0);
                //throw new RuntimeException();
            }

        });

        shell.open();
        shell.pack();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }       
        if(c != null && !c.isDisposed())
            c.dispose();

        if(display != null && !display.isDisposed())
            display.dispose();
    }
}