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