Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWT Java:画布上图像的矩形选择,无需快速重新绘制_Java_Swt - Fatal编程技术网

SWT Java:画布上图像的矩形选择,无需快速重新绘制

SWT Java:画布上图像的矩形选择,无需快速重新绘制,java,swt,Java,Swt,我在画布上有一个图像: canvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE); GridData canvasGridData = new GridData(GridData.VERTICAL_ALIGN_FILL); canvasGridData.verticalSpan = 15; canvasGridData.horizontalAlignment = Gri

我在画布上有一个图像:

    canvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE);
    GridData canvasGridData = new GridData(GridData.VERTICAL_ALIGN_FILL);
    canvasGridData.verticalSpan = 15;
    canvasGridData.horizontalAlignment = GridData.FILL;
    canvasGridData.verticalAlignment = GridData.FILL;
    canvasGridData.grabExcessHorizontalSpace = true;
    canvasGridData.grabExcessVerticalSpace = true;
    canvas.setLayoutData(canvasGridData);
    canvas.addPaintListener(new PaintListener() {
        public void paintControl(PaintEvent e) {
            if (buttonPressed) {
                GC gc = e.gc;
                image = GetMyImagetoDisplay();
                gc.drawImage(image, 10, 10);
            }
        }
    });
当按下GUI按钮时,将调用reDraw()并加载图像

我还有一个鼠标事件来获得矩形选择。它们在图像上绘制一个矩形选择: addListener(SWT.MouseDown,newlistener()){

问题是,当我拖动鼠标时,图像一直在闪烁

你能建议一个解决办法吗

更新:

通过将SWT.DOUBLE_BUFFERED传递给Canvas构造函数,它启用了双缓冲

imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED);
imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED);

看起来您正在将两个
SWT.Paint
侦听器添加到同一个
Canvas
中,它们正在相互竞争

你的第一个听众画“背景”,第二个听众画“前景”。你看到的闪烁很可能是他们两人交替画的

仅使用一个paint listener就可以考虑这样的情况:

canvas.addListener(SWT.Paint, new Listener() {
    @Override
    public void handleEvent(Event event)
    {
        // paint background

        if(drag)
        {
            // paint foreground
        }
    }
});


如果这没有任何改变,请尝试使用
SWT.DOUBLE_BUFFERED
,因为
Canvas
的样式看起来像是在添加两个
SWT。将
侦听器绘制到同一
Canvas
中,它们相互竞争

你的第一个听众画“背景”,第二个听众画“前景”。你看到的闪烁很可能是他们两人交替画的

仅使用一个paint listener就可以考虑这样的情况:

canvas.addListener(SWT.Paint, new Listener() {
    @Override
    public void handleEvent(Event event)
    {
        // paint background

        if(drag)
        {
            // paint foreground
        }
    }
});


如果这没有改变任何东西,尝试使用
SWT.DOUBLE\u BUFFERED
作为
Canvas

的样式来回答这个问题非常简单!!!通过将SWT.DOUBLE\u BUFFERED传递给Canvas构造函数,它启用了双缓冲

imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED);
imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED);

这完全消除了闪烁效应,回答起来非常简单!!!通过将SWT.DOUBLE\u BUFFERED传递给Canvas构造函数,它启用了双缓冲

imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED);
imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED);

这完全消除了闪烁效果

只需注意,这段代码在我的Mac电脑上运行的次数更少,但Mac电脑默认为双缓冲,因此可能正在处理闪烁和两个绘制侦听器。我确实必须恢复第二个绘制侦听器中设置的背景色。很好的一点-我已经合并了两个侦听器。不可原谅但它仍然闪烁。这一定是因为我在每次鼠标移动时都会添加图像。我可能需要在其上覆盖一个小部件来处理矩形selection@Baz没有-我以为这只是为了动画类型的效果,但我将采取一个look@Baz你是对的!编辑你的答案,我会接受你的答案,因为它只是公平的,因为你的建议在一篇评论中,这段代码在我的Mac上运行得更少,但Mac默认为双缓冲,因此可能正在处理闪烁和两个绘制侦听器。我确实必须恢复第二个绘制侦听器中设置的背景颜色。好的一点-我已经合并了两个侦听器。不幸的是,它仍然闪烁。它必须是b因为我在每次鼠标移动时都会添加图像。我可能需要在上面覆盖一个小部件来处理矩形selection@Baz没有-我以为这只是为了动画类型的效果,但我将采取一个look@Baz你是对的!用这个编辑你的答案,我会接受你的答案,因为这是公平的,正如你在一份声明中所建议的那样comment@Baz是的,我接受了d你现在回答-谢谢增益:)@Baz是的-我现在接受了你的回答-谢谢增益:)