【问题标题】:Java swt delete/undo for paint commadJava swt 删除/撤消绘制命令
【发布时间】:2012-12-30 12:19:12
【问题描述】:

考虑 -

public class MainCanvas extends Canvas {...}

Display display = new Display();
display = new Display();
myShell = new Shell(display);
myCanvas = new MainCanvas(myShell, SWT.NO);
GC myGC = new GC(myShell);
myGC.fillOval(10,20,30,40) ; //paint shape ..

现在我想从画布上删除myGC.fillOval(10,20,30,40) ;绘制的形状。

有什么命令可以删除最后的绘画,或者清除画布的命令吗?

【问题讨论】:

  • 为什么不直接填充一个覆盖整个 GC 的矩形?
  • javax.swing.undo 在 Swing 中提供撤消/重做功能,不确定 SWT 中的替代方案
  • 您可以做的是在每次绘图操作后将画布作为图像保存在堆栈中,并弹出堆栈以撤消。

标签: java shell graphics swt java-canvas


【解决方案1】:

非常好的问题。我刚开始使用 JAVA SWT,我遇到了同样的问题。

我想出的解决方案是用一个新的 Canvas 替换它,每次我必须清空它的内容而不影响其他任何东西时都是相同的。

为此,我使用 canvas.dispose() 命令并使用 shell.redraw()shell.pack 重绘和重新打包 Shell () 以便正确调整窗口大小。这些命令是从另一个事件中调用的,例如按下按钮(下面提供的示例中的 Enter 按钮)。另外,请注意,在下面的示例中,我使用的是 GridLayout(有关详细信息,请参阅 http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html),并且我正在使用整数数组创建折线。

    myCanvas = new Canvas(shell, SWT.BORDER); // create the initial instance of the Canvas
    gridData = new GridData(GridData.FILL, GridData.FILL, true, true);
    gridData.widthHint = 1100; // set desired width
    gridData.heightHint = 800; // set desired height
    gridData.verticalSpan = 3; // set number of columns it will occupy
    myCanvas.setLayoutData(gridData);


    myEnter_Button.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent mainEvent) {
            myCanvas.dispose(); // delete the Canvas
            myCanvas = new Canvas(shell, SWT.BORDER);
            GridData redrawGridData = new GridData(GridData.FILL, GridData.FILL, true, true);
            redrawGridData.widthHint = 1100;
            redrawGridData.heightHint = 800;
            redrawGridData.verticalSpan = 3;
            myCanvas.setLayoutData(redrawGridData);
            shell.redraw();
            shell.pack(); // pack shell again

    myCanvas.addPaintListener(new PaintListener() {
                public void paintControl(final PaintEvent event) {
                    // coordinateIntegerArray not displayed in this example
                    event.gc.drawPolyline(coordinateIntegerArray);//draw something

                    }
                }
            });

            myCanvas.redraw();
        }
    });

我希望这会有所帮助。如果我设法找到一种专门删除/撤消最后绘制的绘画对象的方法,我一定会通知您。

干杯!

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2023-03-26
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2021-06-02
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多