gpt4 book ai didi

java - Grahpics2D Draw 和 JPanel 重绘的并发问题

转载 作者:行者123 更新时间:2023-12-01 14:20:29 25 4
gpt4 key购买 nike

所以,我有一张 map ,我希望能够在上面绘制矩形以突出显示某个区域。释放鼠标时,会在 map 上绘制一个永久矩形,该矩形将持续存在,直到再次拖动鼠标开始创建新矩形。当鼠标被拖动时,矩形轮廓应该随着它的移动而创建。

重新单击鼠标时,持久矩形将被删除,这意味着应用程序将启动新的拖动事件。

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

如果我单击然后等待图像重新绘制,然后再开始拖动,则这个问题不存在,并且如果我在开始在 onMouseDragged 中绘制矩形之前 hibernate 线程,以便它有时间重新绘制。

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

请注意,无论轮廓如何,绘制的持久矩形都是正确的。

这就是矩形的样子 the weird rectangle

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>并添加当前的 RectanglemouseReleased() 上的列表。 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是一个 boolean 值,控制是否绘制新矩形或将现有选择拖动到新位置。

因为所有渲染都必须发生在 EDT 上,我怀疑您需要(或想要)一个新线程。

关于java - Grahpics2D Draw 和 JPanel 重绘的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17620804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com