eclipse rcp: пользовательский рисунок на композите, у которого не работает FillLayout - PullRequest
0 голосов
/ 28 сентября 2011

Я пытаюсь добавить 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);
            }

        });

, но если pageComposite установлен с FillLayout ,граница не будет нарисована.

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 Ответ

2 голосов
/ 30 сентября 2011

С SWT org.eclipse.swt.layout.FillLayout ваш paint event listener не вызывается , и поэтому ваша граница не прорисовывается.

Причина в том, что вы используете FillLayout следующим образом:

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

Тогда вы не устанавливаете никаких дополнительных украшений, таких как indentation, margin и т. Д. И, следовательно, уровень ОС 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();
    }
}
...