そのため、領域を強調表示するために四角形を描画できるようにしたい地図があります。マウスを放すと、マップ上に永続的な四角形が描画され、マウスを再度ドラッグして新しい四角形の作成を開始するまで持続します。マウスがドラッグされている間、それに沿って長方形の輪郭が作成されます。
マウスが再クリックされると、永続的な四角形が削除されます。これは、アプリケーションを指定すると、新しいドラッグ イベントが開始されることを意味します。
何が起こるかというと、最初の四角形は正しくペイントされ、すべて問題ありませんが、現在ドラッグされている後続の四角形の角が切り取られています (画像リンクは下部にあります)。
クリックして、ドラッグを開始する前に画像が再描画されるのを待つと、この問題は存在しません。また、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();
}
}