0

そのため、領域を強調表示するために四角形を描画できるようにしたい地図があります。マウスを放すと、マップ上に永続的な四角形が描画され、マウスを再度ドラッグして新しい四角形の作成を開始するまで持続します。マウスがドラッグされている間、それに沿って長方形の輪郭が作成されます。

マウスが再クリックされると、永続的な四角形が削除されます。これは、アプリケーションを指定すると、新しいドラッグ イベントが開始されることを意味します。

何が起こるかというと、最初の四角形は正しくペイントされ、すべて問題ありませんが、現在ドラッグされている後続の四角形の角が切り取られています (画像リンクは下部にあります)。

クリックして、ドラッグを開始する前に画像が再描画されるのを待つと、この問題は存在しません。また、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();

    }
}
4

1 に答える 1

1

を維持し、 のリストに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は、新しい長方形を描画するか、既存の選択範囲を新しい場所にドラッグするかを制御するブール値です。

すべてのレンダリングはEDTで行う必要があるため、新しいスレッドが必要 (または必要) であるとは思えません。

于 2013-07-12T21:14:10.753 に答える