所以,我有一张地图,我希望能够绘制矩形以突出显示一个区域。释放鼠标时,将在地图上绘制一个永久矩形,该矩形将持续存在,直到再次拖动鼠标以开始创建新矩形。在拖动鼠标的同时,应该随着它创建矩形轮廓。
当鼠标被重新点击时,将删除持久化矩形,因为应用程序意味着将启动新的拖动事件。
第一个矩形被正确绘制并且一切都很好,但是当前被拖动的后续矩形的角落被切掉(底部的图像链接)。
如果我在开始拖动之前单击然后等待图像重新绘制,则此问题不存在,以及如果我在开始在onMouseDragged中绘制矩形之前睡眠线程,以便它有时间重新绘制。 / p>
我想要一个比在屏幕上显示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();
}
}
答案 0 :(得分:1)
您需要维护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上进行,我怀疑你是否需要(或想要)一个新线程。