Java swt canvas 绘制监听器如何工作?

标签 java canvas swt 2d

我刚刚开始使用 swt 的 Canvas 。我的印象是,来自图形 Controller (gc)的绘制命令可以在附加到 Canvas 的任何监听器中执行。但我想,我的问题是什么触发了绘制监听器方法paintControl

canvas.redraw() 也会导致它运行吗?

感谢任何能给我指明正确方向的人。如果有我可以阅读的有关此事的教程或书籍(一般也包括 swt 中的 2d 绘图),我很想听听。

编辑: 这是代码,我遇到了一个问题,graphCanvas 没有填充多余的垂直空间?当我让它填充多余的水平空间时它也不起作用。但当我将这些属性应用于复合 Material 时,它似乎起作用了。有什么想法吗?

Color black = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
    chartComposite = new Composite(parent, SWT.NONE);
    GridLayout chartGridLayout = new GridLayout(1,false);
    GridData chartGridData = new GridData();
    chartGridData.grabExcessHorizontalSpace = true;
    chartGridData.grabExcessVerticalSpace = true;

    chartComposite.setLayout(chartGridLayout);
    chartComposite.setLayoutData(chartGridData);

    chartInnerComposite = new Composite(chartComposite, SWT.NONE);
    GridLayout chartInnerGridLayout = new GridLayout(2,false);
    GridData chartInnerGridData = new GridData();
    chartInnerGridData.grabExcessHorizontalSpace = true;
    chartInnerGridData.grabExcessVerticalSpace = true;
    chartInnerComposite.setLayout(chartInnerGridLayout);
    chartInnerComposite.setLayoutData(chartInnerGridData);
    /**
     * Create the four canvases
     */

    Canvas yCanvas = new Canvas(chartInnerComposite, SWT.None);
    graphCanvas = new Canvas(chartInnerComposite, SWT.None);
    GridLayout graphGridLayout = new GridLayout(1, false);
    graphGridLayout.makeColumnsEqualWidth = false;
    GridData graphGridData = new GridData(SWT.FILL);
    graphGridData.widthHint = 400;
    graphGridData.grabExcessVerticalSpace = true;
    graphCanvas.setLayout(graphGridLayout);
    graphCanvas.setLayoutData(graphGridData);
    graphCanvas.addPaintListener(new PaintListener() {

        @Override
        public void paintControl(PaintEvent e) {
            e.gc.drawLine(20, 20, 500, 500);
            e.gc.drawRectangle(0, 0, graphCanvas.getSize().x -1, graphCanvas.getSize().y -1);

            e.gc.drawLine(0, 40, 500, 500);
            e.gc.drawLine(0, 0, 0, 1200);
            e.gc.drawLine(0, 0, 1200, 0);               
        }
    });
    /*graphCanvas.setSize(400, 400);
    graphCanvas.redraw();
    graphCanvas.update();*/


    Canvas filler = new Canvas(chartInnerComposite, SWT.NONE);
    Canvas xCanvas = new Canvas(chartInnerComposite, SWT.None);

最佳答案

您的代码绝对可以手动调用canvas.redraw(),这将触发paintControl事件。 SWT 本身也会根据需要触发重绘,例如调整窗口大小以及 Canvas 被其他窗口遮挡/取消遮挡等情况。

关于Java swt canvas 绘制监听器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095428/

相关文章:

javascript - HTML5 <canvas> 无抗锯齿

java - 使用哪个 SWT 组件以图标(而不是列表)模式实现文件浏览器/资源管理器

Eclipse RCP :- If a view contains huge selection like 4000 objects then applications takes time to show context menus

java - 修改HashMap中LinkedList的值

java - 如何正确使用JTA资源回收方法?

java - 将 Java 后台进程输出重定向到/dev/null - 这是个好主意吗?

java - JFace Treeviewer 添加新的根元素

java - 如何通过 tabLayout 显示 fragment View

javascript - 为了获得良好的性能,是否需要在 HTML5 中清除 Canvas [ 2D Context ]?

canvas - CamanJS - 应用过滤器/操作后更改底层 Canvas