1

mousedrag イベントに基づいて四角形を描画したい。ユーザーがマウスをドラッグすると、アプレットの四角形は現在のマウス座標に基づいて増減する必要があります。私は次のコードを持っています。

次のコードでは、描画操作を実行しているキャンバスを拡張する SelectionArea クラスを使用しています。ちらつきを減らし、アプレットの以前の状態を保存するために、ダブルバッファリングのためにこのクラスで画像変数を使用しています(つまり、アプレットのコンテンツを描画します)

しかし、最初の長方形を描画すると、コードは正常に機能します。2 番目の四角形の描画を開始すると、以前に描画された四角形が消えます。前に描いた四角形を画面に表示したい

これを解決する方法を教えてください。

4

2 に答える 2

3

必要なことは、以前に描画した四角形を何らかのデータ構造に保存して、後で再度描画できるようにすることです。

このコード(長さについて申し訳ありませんが、あなたが説明していることと同様のことを行います。
それを使用するにJPanelは、JFrame.

public class DrawPane extends JPanel {

    private List<DrawnShape> drawings;
    private DrawnShape curShape;

    public DrawPane() {
        drawings = new ArrayList<DrawnShape>();
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(300, 300));
        addMouseListener(clickListener);
        addMouseMotionListener(moveListener);
    }

    @Override
    protected void paintComponent(Graphics g2) {
        super.paintComponent(g2);
        Graphics2D g = (Graphics2D) g2;
        for (DrawnShape s : drawings) {
            s.draw(g);
        }
        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(2));

        if (curShape == null)
            return;
        curShape.draw(g);
    }

    private MouseListener clickListener = new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            curShape = new DrawnShape(e.getPoint(), e.getPoint());
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            drawings.add(new DrawnShape(curShape.getClickP(), e.getPoint()));
            curShape = null;
        }
    };

    private MouseMotionListener moveListener = new MouseMotionListener() {

        @Override
        public void mouseDragged(MouseEvent e) {
            curShape = new DrawnShape(curShape.getClickP(), e.getPoint());
            repaint();
        }
        @Override
        public void mouseMoved(MouseEvent e) {
        }
    };
}

class DrawnShape {

    private Point p1, p2;

    public DrawnShape(Point p1, Point p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public Point getClickP() {
        return p1;
    }

    public void draw(Graphics2D g) {
        g.drawLine(p1.x, p1.y, p2.x, p1.y);
        g.drawLine(p1.x, p1.y, p1.x, p2.y);
        g.drawLine(p2.x, p2.y, p2.x, p1.y);
        g.drawLine(p2.x, p2.y, p1.x, p2.y);
    }
}
于 2009-07-19T15:17:48.977 に答える
0

カスタム ペインティング アプローチでは、これを行うための 2 つのテクニックを示します。

于 2009-07-19T20:20:41.223 に答える