1

マウスボタンを離したときにいくつかのピクセルを移動するはずの次のコードがあります。

if (selected != -1) {
    Point to = e.getPoint();
    int dx = start.x - to.x;
    int dy = start.y - to.y;
    for (Point p: store.get(selected)) {
        int px = (int) p.getX();
        int py = (int) p.getY();
        p.move(px - dx, py - dy);
    }

    validate();

デバッガーを使用すると、ポイント p は実際に新しい値を取得しますが、ビジュアルは更新されません。私を助けてください。

以下は私のプログラムのコード全体です。

public class Pisi extends JFrame implements MouseMotionListener, MouseListener {
ArrayList<ArrayList<Point>> store = new ArrayList<ArrayList<Point>>();
ArrayList<Point> pts = new ArrayList<Point>();
Point start;
static int xsize = 450;
static int ysize = 300;
int listNumber = 0;
int selected = -1;



public static void main(String[] args) {
    Pisi d = new Pisi();
    d.setSize(xsize, ysize);
    d.setLocationRelativeTo(null);
    d.addMouseMotionListener(d);
    d.addMouseListener(d);
    d.setResizable(false);
    d.setVisible(true);
}

@Override
public void update(Graphics g) {
    paint(g);
}
@Override
public void paint(Graphics g) {
    Point last = null;

    for (Point p : pts) {

        if (last == null) {
            last = p;
            continue;
        }
        g.drawLine(last.x, last.y, p.x, p.y);
        last = p;
    }
}

@Override
public void mouseDragged(MouseEvent e) {

    if (e.getButton() == MouseEvent.BUTTON1) {
        pts.add(e.getPoint());
        repaint();
    }

}

@Override
public void mouseMoved(MouseEvent e) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void mouseClicked(MouseEvent e) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void mousePressed(MouseEvent e) {
    Point point = e.getPoint();
    start = null;
    selected = -1;
    for (ArrayList<Point> points: store) {
        for (Point p : points) {
            double dist = point.distanceSq(p);
            if (dist < 10) {
                selected = store.indexOf(points);
            }
        }
    }
    if (selected != -1) {
        start = e.getPoint();
    }
    System.out.println(selected);
}


@Override
public void mouseReleased(MouseEvent e) {
    if (selected != -1) {
        Point to = e.getPoint();
        int dx = start.x - to.x;
        int dy = start.y - to.y;
        for (Point p: store.get(selected)) {
            int px = (int) p.getX();
            int py = (int) p.getY();
            p.move(px - dx, py - dy);
        }

        validate();
    } else if (e.getButton() == MouseEvent.BUTTON1 && pts.size() != 0) {
        store.add(new ArrayList<Point>(listNumber));
        for (int i = 0; i < pts.size(); i++) {
            store.get(listNumber).add(pts.get(i));
        }
        listNumber++;
    }
    pts.clear();

}

@Override
public void mouseEntered(MouseEvent e) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void mouseExited(MouseEvent mouseEvent) {
    //To change body of implemented methods use File | Settings | File Templates.
}
}
4

2 に答える 2

4

私がお勧めします:

  • まず、JFramepaintComponent(...)のメソッドで直接ではなく、JPanelのメソッドで描画します。paint(...)これにより、Swing の自動ダブル バッファリングにアクセスできるようになり、JFrame の子または境界線のグラフィックスが台無しになるのを防ぐことができます。
  • ArrayList<Point>とを使用するのArrayList<ArrayList<Point>>ではなく、代わりに Path2D とArrayList<Path2D>.
  • `paintComponent's Graphics オブジェクトを Graphics2D オブジェクトにキャストすること
  • この Graphics2D オブジェクトを使用して、draw(Shape s)このメソッドを使用して Path2D オブジェクトを描画すること。
  • Path2Dcontains(...)メソッドを使用して、マウス プレスが保持されている Path2D オブジェクトで発生しているかどうかを確認します。List<Path2D>
  • Path2D が選択されている場合は、AffineTransform を使用して変換メソッドを介して移動します。

編集:
いいえ、contains(...)Path2D によって輪郭が描かれた凹状領域でマウスが押された場合、これは true であるため、機能しません。これをさらに調べてみると…

編集 2:
これを回避する 1 つの方法は、PathIterator を使用して Path2D を反復処理し、mousePress が Path2D を構成する線分の近くにあるかどうかを確認することです。

于 2013-01-12T22:20:37.617 に答える
0

validate()最初にメソッド(Containerクラスのメソッド)を試すことをお勧めします

注: validate() メソッドに関する情報

validate()メソッドが機能しない場合 は、次を使用してみてください。

update()メソッド (メソッドを呼び出すpaint()) またはrepaint()メソッド。

于 2013-01-12T21:20:33.443 に答える