关键字:Draw2d 拖拽 Drag and Drop
public class Scroller2 {
IFigure getRootFigure() {
Panel panel = new Panel();
panel.setLayoutManager(new XYLayout());
RectangleFigure rFigure = new RectangleFigure();
rFigure.setSize(55,55);
rFigure.setBackgroundColor(ColorConstants.green);
new Dnd(rFigure);
panel.add(rFigure);
return panel;
}
public static void main(String args[]) {
Display display = Display.getDefault();
Shell shell = new Shell();
shell.setSize(400, 300);
shell.open();
shell.setText("ScrollPane Example");
LightweightSystem lws = new LightweightSystem(shell);
lws.setContents(new Scroller2().getRootFigure());
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ())
display.sleep ();
}
}
}
class Dnd extends MouseMotionListener.Stub implements MouseListener {
Point start;
public Dnd(IFigure figure) {
figure.addMouseMotionListener(this);
figure.addMouseListener(this);
}
public void mouseReleased(MouseEvent e){
Figure f = ((Figure)e.getSource());
f.setCursor(null);
}
public void mouseClicked(MouseEvent e){}
public void mouseDoubleClicked(MouseEvent e){}
public void mousePressed(MouseEvent e) {
Figure f = ((Figure)e.getSource());
f.setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_SIZEALL));
start = e.getLocation();
}
public void mouseDragged(MouseEvent e) {
if(start == null) {
return;
}
Point p = e.getLocation();
Dimension d = p.getDifference(start);
start = p;
Figure f = ((Figure)e.getSource());
f.setBounds(f.getBounds().getTranslated(d.width, d.height));
}
}
关于拖拽有个奇怪的问题:
有连线 + add(IFigure figure, Object constraint)的方式加的图形。不好拖拽,可能因为constraint。
public class HelloWorld2 {
public static void main(String args[]) {
Shell shell = new Shell();
shell.setText("Draw2d Hello World");
shell.setSize(300, 300);
shell.open();
// create content 4 shell.
createContent4Shell(shell);
while (!shell.isDisposed ()) {
if (!Display.getDefault().readAndDispatch ())
Display.getDefault().sleep ();
}
}
private static void createContent4Shell(Shell shell) {
Panel rootFigure = new Panel();
rootFigure.setLayoutManager(new XYLayout());
IFigure figure1 = new Ellipse();
Ellipse figure2 = new Ellipse();
// --------------------------------------------------------
// add connection
PolylineConnection connection = new PolylineConnection();
connection.setSourceAnchor(new ChopboxAnchor(figure1));
connection.setTargetAnchor(new EllipseAnchor(figure2));
rootFigure.add(connection);
// figure1.setBounds(new Rectangle(10,10,60,30));
// figure2.setBounds(new Rectangle(170,170,90,90));
// rootFigure.add(figure1);
// rootFigure.add(figure2);
rootFigure.add(figure2,new Rectangle(170,170,90,90));
rootFigure.add(figure1,new Rectangle(10,10,60,30));
new Dnd(figure1);
new Dnd(figure2);
LightweightSystem lws = new LightweightSystem(shell);
lws.setContents(rootFigure);
}
}
class Dnd extends MouseMotionListener.Stub implements MouseListener{
Point start;
public Dnd(IFigure figure) {
figure.addMouseMotionListener(this);
figure.addMouseListener(this);
}
public void mouseReleased(MouseEvent e) {
Figure f = ((Figure)e.getSource());
f.setCursor(null);
}
public void mouseClicked(MouseEvent e) {}
public void mouseDoubleClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
Figure f = ((Figure)e.getSource());
f.setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_SIZEALL));
start = e.getLocation();
}
public void mouseDragged(MouseEvent e) {
if(start == null) {
return;
}
Point p = e.getLocation();
Dimension d = p.getDifference(start);
start = p;
Figure f = ((Figure)e.getSource());
f.setBounds(f.getBounds().getTranslated(d.width, d.height));
}
}
但改为:
figure1.setBounds(new Rectangle(10,10,60,30));
figure2.setBounds(new Rectangle(170,170,90,90));
rootFigure.add(figure1);
rootFigure.add(figure2);
// rootFigure.add(figure2,new Rectangle(170,170,90,90));
// rootFigure.add(figure1,new Rectangle(10,10,60,30));
就可以拖动。可能是因为约束的原因。
看一下源代码可以看出区别,
public final void add(IFigure figure) {
add(figure, null, -1);
}
而
public final void add(IFigure figure, Object constraint) {
add(figure, constraint, -1);
}
也就说约束的方式就定死了figure的大小位置了。