Java的SWT:GC无法在画布上绘制简单的矩形,但可以在图像上绘制。

3
我无法获取GC (图形上下文)对象,在画布上绘制一个简单的矩形,我弄不清楚我缺少了什么... 考虑这个简单的代码片段:
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();
    }

}

这将不会绘制任何东西:
enter image description here 而且这也不会:
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();
    }

}

enter image description here

当我设置画布的背景图像并在图像上绘制时,请注意发生的情况:

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();
    }

}

enter image description here

突然间,一个奇迹发生了。它确实画出了矩形。
所以,在图像上绘制没有问题,但在shell/canvas上绘制不会产生任何东西...
我错过了什么?我不应该能够在任何Drawable上绘制吗?
1个回答

1

这是一个时间问题(在初始构建过程中在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);
    }
});

enter image description here


1
谢谢你的出色回答!不过我有一个问题:这个后续的绘制通道在哪里?自从GC对其进行绘制,直到我打开shell之前,上面的代码都没有再进行任何绘制。 - so.very.tired
2
我不是完全确定,但根据我的经验,我通常期望在打开、恢复和调整相应的 shell 时自动重绘发生,并且可能还会在 UI 的某些部分由于部分遮挡而需要重新绘制时(编辑:以及当组合被布局时)发生。自动化是指事件队列自行完成。如果这真的困扰着您,您可能需要调查重绘方法的调用者。 - hiergiltdiestfu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接