1

Draw2d ライブラリ (GEF なし) を使用して小さなグラフィカル エディターに取り組んでいます。1 つの要件は、マウスでドラッグして Figure を移動できることです。これは、フィギュア間に (Polyline-) 接続がない限り問題なく機能します。接続を追加すると、すべてが正しくレンダリングされますが、フィギュアを移動することはできません。

問題を示すコード例を次に示します。

public class Main {

    public static void main(String[] args) {
        Display d = new Display();
        final Shell shell = new Shell(d);
        shell.setSize(400, 400);
        shell.setText("Draw2d Test");
        LightweightSystem lws = new LightweightSystem(shell);
        Figure contents = new Figure();
        XYLayout contentsLayout = new XYLayout();
        contents.setLayoutManager(contentsLayout);

        // create figures
        Figure f1 = new TestFigure("Test 1");
        Figure f2 = new TestFigure("Test 2");

        MouseManager mm = new MouseManager();

        // register mouse listeners
        f1.addMouseMotionListener(mm);
        f1.addMouseListener(mm);
        f2.addMouseMotionListener(mm);
        f2.addMouseListener(mm);

        // set constraints to layout manager
        contentsLayout.setConstraint(f1, new Rectangle(10, 10, -1, -1));
        contentsLayout.setConstraint(f2, new Rectangle(200, 200, -1, -1));

        // add to layout manager
        contents.add(f1);
        contents.add(f2);

        // add connection
        // When uncommenting these lines, dragging works fine
        PolylineConnection c = new PolylineConnection();
        c.setSourceAnchor(new ChopboxAnchor(f1));
        c.setTargetAnchor(new ChopboxAnchor(f2));
        c.setConnectionRouter(new ManhattanConnectionRouter());
        contents.add(c);

        lws.setContents(contents);
        shell.open();
        while (!shell.isDisposed()) {
            while (!d.readAndDispatch()) {
                d.sleep();
            }
        }
    }
}

class MouseManager implements MouseMotionListener, MouseListener {
    Figure selection;
    private Point lastDragLocation;

    @Override
    public void mousePressed(MouseEvent me) {
        System.out.println("mouse pressed");
        selection = (Figure) me.getSource();
    }

    @Override
    public void mouseReleased(MouseEvent me) {
        System.out.println("mouse released");
        selection = null;
        lastDragLocation = null;
    }

    @Override
    public void mouseDragged(MouseEvent me) {
        if (lastDragLocation != null && selection != null) {
            int offsetX = me.getLocation().x - lastDragLocation.x;
            int offsetY = me.getLocation().y - lastDragLocation.y;
            int newX = selection.getLocation().x + offsetX;
            int newY = selection.getLocation().y + offsetY;
            System.out.println(String.format("NewX: %d, NewY: %d", newX, newY));
            selection.setBounds(selection.getBounds().getTranslated(offsetX,
                    offsetY));

        }
        lastDragLocation = me.getLocation();
    }

    // [removed empty implementations of the interface for this post]
}

class TestFigure extends RectangleFigure {
    public Color classColor;

    public TestFigure(String name) {
        ToolbarLayout layout = new ToolbarLayout();
        setLayoutManager(layout);
        setOpaque(true);

        classColor = new Color(null, 255, 255, 206);
        setBackgroundColor(classColor);

        Label lbl_name = new Label(name);
        add(lbl_name);
    }

    @Override
    protected void finalize() throws Throwable {
        classColor.dispose();
        super.finalize();
    }
}

2 つの図の間に接続がある場合にドラッグを可能にする方法を知っている人はいますか (接続のドラッグをレンダリングする必要はありません)。

4

1 に答える 1

1

2 つの問題:

  1. mouseDragged関数ではFigure、親コンテナー内の図の制約を変更する代わりに、の境界を変更しています。
  2. 親を再検証していません。

次の変更を加えましたが、動作します。

public void mouseDragged(MouseEvent me) {
  if(lastDragLocation != null && selection != null) {
    int offsetX = me.getLocation().x - lastDragLocation.x;
    int offsetY = me.getLocation().y - lastDragLocation.y;
    int newX = selection.getLocation().x + offsetX;
    int newY = selection.getLocation().y + offsetY;
    System.out.println(String.format("NewX: %d, NewY: %d", newX, newY));
    // selection.setBounds(selection.getBounds().getTranslated(offsetX, offsetY)); <-- this does not work
    selection.getParent().getLayoutManager()
        .setConstraint(selection, selection.getBounds().getTranslated(offsetX, offsetY));
    selection.getParent().revalidate();

  }
  lastDragLocation = me.getLocation();
}

しかし、マウスを速く動かしすぎると、どうにかして図から抜け出すことができ、動かなくなるため、実装にまだ問題があると思います。私がすることは、親図でマウスを聞いて、マウスが内側の図の上で動き始めたときをキャプチャし (parents を使用Figure.findFigureAt())、マウスの動きに合わせて内側の図を動かします。

于 2012-07-19T09:08:55.170 に答える