SWT Eclipse Draw2D Drag and Drop (ruckelt)

Pantoi

Aktives Mitglied
Hallo, wie in einem anderen Thread bereits angekündigt, ruckelt das Ziehen der Figures bei mir.
Ich hab das Drag and Drop zZ so gelöst:

Java:
package gui.viewpart;

import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.MouseMotionListener;
import org.eclipse.draw2d.RoundedRectangle;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.wb.swt.SWTResourceManager;

public class D2Drag extends ViewPart {
	public D2Drag() {
	}

	private FigureCanvas figureCanvas;
	public static final String ID = "d2drag"; //$NON-NLS-1$
	public Point point;
	private Figure dragSource;
	private Figure root;

	/**
	 * Create contents of the view part
	 * 
	 * @param parent
	 */
	@Override
	public void createPartControl(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(new FillLayout());
		this.figureCanvas = new FigureCanvas(container, SWT.NONE);
		figureCanvas.setBackground(SWTResourceManager
				.getColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
		populateCanvas();
	}

	/**
* 
*/
	private void populateCanvas() {
		root = new Figure();
		root.setOpaque(false);
		root.setBounds(new Rectangle(0, 0, 575, 350));

		Figure figure = new Figure();
		figure.setBackgroundColor(Display.getCurrent().getSystemColor(
				SWT.COLOR_RED));
		figure.setBounds(new Rectangle(0,0,100,100));
		RoundedRectangle base = new RoundedRectangle();
		base.setBackgroundColor(Display.getCurrent().getSystemColor(
				SWT.COLOR_TITLE_BACKGROUND_GRADIENT));
		base.setBounds(new Rectangle(0, 0, 100, 100));
		figure.add(base);

		// Feststellen ob eine Komponente ausgewählt wird (bei mousePressed)
		figure.addMouseListener(new MouseListener() {

			@Override
			public void mouseDoubleClicked(MouseEvent arg0) {

			}

			@Override
			public void mousePressed(MouseEvent arg0) {

				dragSource = (Figure) arg0.getSource();

			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
				// nach drag die source zurücksetzen
				dragSource = null;
			}
		});

		root.add(figure);
		
		root.addMouseMotionListener(new MouseMotionListener() {

			@Override
			public void mouseDragged(MouseEvent arg0) {
				dragSource.setLocation(arg0.getLocation());

			}

			@Override
			public void mouseEntered(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mouseExited(MouseEvent arg0) {
			}

			@Override
			public void mouseHover(MouseEvent arg0) {

			}

			@Override
			public void mouseMoved(MouseEvent arg0) {

			}

		});

		root.addMouseMotionListener(new MouseMotionListener() {

			@Override
			public void mouseDragged(MouseEvent arg0) {

				dragSource.setLocation(arg0.getLocation());

			}

			@Override
			public void mouseEntered(MouseEvent arg0) {
				// TODO Auto-generated method stub

			}

			@Override
			public void mouseExited(MouseEvent arg0) {
			}

			@Override
			public void mouseHover(MouseEvent arg0) {

			}

			@Override
			public void mouseMoved(MouseEvent arg0) {

			}

		});
		figureCanvas.setContents(root);
	}

	@Override
	public void setFocus() {
		// TODO Auto-generated method stub
		
	}
}

Vielleicht gehe ich auch drag & drop falsch an... hilfe ist gern gesehen 🙂
 
Sowohl GEF als auch Draw2D, als auch Graphiti basieren auf Draw2D und alle supporten Drag'n'Drop problemlos.
Ich habe mir mal kurz den Zest Quellcode angesehen (Zest ist am kleinsten), aber auf Anhieb keinen großen Unterschied in der Drag'n'Drop Implementierung festgestellt (ausser das die von Zest natürlich wesentlich vollständiger ist).
Aber wie auch immer, schau dir den Unterscheid einfach selbst mal an:
Java:
    public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());
        Graph g = new Graph(shell, SWT.NONE);
        GraphNode item = new GraphNode(g, SWT.NONE);
        item.setText("A Node");
		shell.setSize(500, 500);
		shell.setVisible(true);
		
		while (!shell.isDisposed ()) {
			if (!display.readAndDispatch ()) display.sleep ();
		}
		display.dispose();
	}

Warum hast du dich eigentlich dafür entschieden selbst mit Draw2D zu Zeichnen als eines der 'Enduserframeworks' zu verwenden?
 
was würdest du als 'Enduserframework' bezeichnen?

so weit ich das gesehen habe hat zest nur ein paar layout manager,
graphiti ist für graphen... wenn jemand also eigene controls schreiben will muss er wohl auf draw2d zurückgreifen...
da schafft man in nem tag schon graphisch gute & interaktive sachen...
 
Alle basieren auf Draw2D. GEF ist die generische Infrastruktur für grafische Editoren, Draw2D die Zeichen/Event Ebene.

Zest ist super wenn man mit wenig Code eine schöne Visualisierung, oder einen einfachen Editor haben will. Deutlich mehr als ein paar Layout Manager wie du schreibst. Man kann es sich in etwa so vorstellen:
Zest ist zu Draw2D wie JFace zu SWT.
Zest - Eclipsepedia
Komplexe Editoren würde ich eher mit Graphiti, reinem GEF, oder GMF entwickeln.
 

Neue Themen


Zurück
Oben