Java 的 SWT:GC 不会在 canvas 上绘制简单的矩形,但会在图像上绘制它

Java's SWT: GC will not draw simple rectangle on a canvas, but will draw it on an image

我无法让 GC(图形上下文)对象在 canvas 上绘制一个简单的矩形,而且我不知道我错过了什么...

考虑这个简单的代码片段:

public class MainWindow {

    private Display display;
    private Shell shell;

    public static void main(String args[]) {
        MainWindow mw=new MainWindow();
        mw.render();
    }

    public MainWindow() {

        display=Display.getDefault();
        shell=new Shell(display, SWT.DIALOG_TRIM);

        shell.setText("Graphic Test");
        shell.setSize(400,300);
        shell.setLocation(0, 0);

        GC gc=new GC(shell);
        gc.drawRectangle(50,50,45,45);
        gc.dispose();


    }

    public void render() {

        shell.open();

        while (!shell.isDisposed()) {

            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

        display.dispose();
    }

}

这不会绘制任何东西:

这也不会:

public class MainWindow {

    private Display display;
    private Shell shell;

    public static void main(String args[]) {
        MainWindow mw=new MainWindow();
        mw.render();
    }

    public MainWindow() {

        display=Display.getDefault();
        shell=new Shell(display, SWT.DIALOG_TRIM);

        shell.setText("Graphic Test");
        shell.setSize(400,300);
        shell.setLocation(0, 0);

        Canvas canvas=new Canvas(shell, SWT.NONE);
        canvas.setSize(shell.getSize().x, shell.getSize().y);

        GC gc=new GC(canvas);
        gc.drawRectangle(50,50,45,45);
        gc.dispose();


    }

    public void render() {

        shell.open();

        while (!shell.isDisposed()) {

            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

        display.dispose();
    }

}

但是当我用背景图片设置 canvas 并在图片上作画时,看看会发生什么:

public class MainWindow {

    private Display display;
    private Shell shell;

    public static void main(String args[]) {
        MainWindow mw=new MainWindow();
        mw.render();
    }

    public MainWindow() {

        display=Display.getDefault();
        shell=new Shell(display, SWT.DIALOG_TRIM);

        shell.setText("Graphic Test");
        shell.setSize(400,300);
        shell.setLocation(0, 0);

        Image background=new Image(display, "background.jpg");

        Canvas canvas=new Canvas(shell, SWT.NONE);
        canvas.setBackgroundImage(background);
        canvas.setSize(shell.getSize().x, shell.getSize().y);

        GC gc=new GC(background);
        gc.drawRectangle(50,50,45,45);
        gc.dispose();


    }

    public void render() {

        shell.open();

        while (!shell.isDisposed()) {

            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

        display.dispose();
    }

}

突然,奇迹。 绘制矩形。
所以,它在图像上绘制没有问题,但是在 shell/canvas 上绘制不会产生任何东西...

我在这里错过了什么?我不应该可以在任何 Drawable 上绘图吗?

这是一个时间问题(在初始构造期间在 CanvasShell 上绘制将在后续绘制过程中过度绘制,而在 Image 上绘制会坚持您的绘制操作在它的 ImageData 中)。对于 Canvas(或 Shell),您应该在其绘制事件期间绘制,如 tutorial 所示。 PaintEvent 带来了自己的 GC,这是管理绘图操作的正确方法:

final Canvas canvas=..;
canvas.addPaintListener(new PaintListener() { 
    public void paintControl(PaintEvent e) { 
        e.gc.drawRectangle(50,50,45,45);
    }
});