繁体   English   中英

Grahpics2D Draw和JPanel重绘的并发问题

[英]Concurrency Issue with Grahpics2D Draw and JPanel repaint

因此,我有一张地图,希望能够绘制矩形以突出显示一个区域。 释放鼠标后,地图上会绘制一个永久矩形,该矩形将一直保留到再次拖动鼠标以开始创建新矩形为止。 拖动鼠标时,应随其创建矩形轮廓。

重新单击鼠标后,将删除持久矩形,这将给定应用程序意味着将开始一个新的拖动事件。

发生的情况是第一个矩形正确绘制,并且一切都很好,但是当前正在拖动的后续矩形的角被切除(底部的图像链接)。

如果单击然后在开始拖动之前等待图像重新绘制,则此问题不存在,以及如果我开始在onMouseDragged中绘制矩形之前休眠线程,以便有时间重新绘制。

我想要一个比那些更优雅的解决方案,让屏幕在onMouseDragged中创建的矩形显示在屏幕上之前重新绘制。 那么,在不改变绘制矩形的一部分的情况下完成重新绘制的最佳方法是什么?

请注意,尽管轮廓看起来不错,但绘制的持久矩形是正确的。

这就是矩形的样子 奇怪的矩形

public void onMousePressed(MapMouseEvent ev)
{       

    startPos = new Point(ev.getPoint());
    drawer.removeDrawings(pane.getMapContent());
    pane.repaint();
    pane.setIgnoreRepaint(true);        
}

public void onMouseDragged(MapMouseEvent ev)
{
    super.onMouseDragged(ev);
    if (enabled) {
        ensureGraphics();
        if (dragged)
        {
            // because we're in XOR mode, this has the effect of erases the previous rectangle
            graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
        }
        else
        {


        }
        rect.setFrameFromDiagonal(startPos, ev.getPoint());
        graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
        dragged = true;

    }
}
public void onMouseReleased(MapMouseEvent ev)
{
    super.onMouseReleased(ev);
    if (dragged) {
        ensureGraphics();
        dragged = false;           

        drawer drawable = new drawer();
        drawable.drawRectangle((Graphics2D) parentComponent.getGraphics().create(), rect.x, rect.y, rect.width, rect.height, pane.getMapContent());

        graphics.dispose();
        graphics = null;
        pane.setIgnoreRepaint(false);           
        pane.repaint();

    }
}

您需要维护一个List<Rectangle>并将当前Rectangle添加到mouseReleased()上的列表中。 GraphPanel说明了基本的鼠标处理。 在您的情况下,只需渲染图像,任何现有矩形和当前矩形即可。

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // render background
    g.drawImage(image, 0, 0, this);
    // render existing rectangles
    for (Rectangle r : list) {
        r.draw(g);
    }
    // render the current dragged rectangle
    if (selecting) {
        g.setColor(Color.darkGray);
        g.drawRect(mouseRect.x, mouseRect.y,
            mouseRect.width, mouseRect.height);
    }
}

在该示例中, selecting是控制一个新的矩形是否被绷绘制或现有选择被拖动到一个新位置的布尔值。

由于所有渲染都必须在EDT上进行 ,因此我怀疑您是否需要(或想要)新线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM