Eclipse canvas paintListener 从未调用过

Eclipse canvas paintListener never called

我正在为 eclipse 创建一个编辑器扩展,我需要为编辑器的一部分绘制简单的图形部分。据我了解,我应该能够为此使用 eclipse 小部件 Canvas。但是从未调用添加到 canvas 的 PaintListener 的 paintControl 方法。我假设我遗漏了一些关键的简单部分,但我找不到它。这是在 canvas.

上创建、添加和调用重绘的代码
void createGraphicPage() {
    Composite composite = new Composite(getContainer(), SWT.NONE);
    drawWidget = new Canvas(composite, SWT.NONE);

    FormLayout layout = new FormLayout();
    drawWidget.setLayout(layout);
    drawWidget.addPaintListener(new PaintListener() {
        @Override
        public void paintControl(PaintEvent e) {
            System.out.println("inDrawWidget");
            Rectangle r = drawWidget.getClientArea();
            e.gc.drawOval(0, 0, r.width, r.height);
        }
    });
    drawWidget.redraw();
    int index = addPage(composite);
    setPageText(index, "Graphics Editor");
}

你需要在每个包含控件的Composite上设置布局,并且通常在控件上设置布局数据。所以:

Composite composite = new Composite(getContainer(), SWT.NONE);
composite.setLayout(new GridLayout());

Canvas drawWidget = new Canvas(composite, SWT.NONE);
drawWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

drawWidget.addPaintListener(new PaintListener() {
    @Override
    public void paintControl(final PaintEvent e) {
        System.out.println("inDrawWidget");
        final Rectangle r = drawWidget.getClientArea();
        e.gc.drawOval(0, 0, r.width, r.height);
    }
});

我在 Composite 中添加了 GridLayout,在 Canvas 中添加了 GridData 布局数据。 GridData 使 Canvas 使用所有可用的 space。