SWT: Wie kann man einen Button mit der Maus verschieben?

snoopysalive

Mitglied
Hallo!

Ich habe gerade ein Problem mit dem Verschieben von Komponenten mit Hilfe des Mauszeigers.

Konkret habe ich eine leere Shell und ein weißes Composite. Wenn man auf das Composite doppelklickt, erscheint an eben dieser Stelle ein Button.

Jetzt möchte ich diesen Button frei auf dem Composite positionieren können, indem ich ihn mit der Maus verschiebe. Hier mal der Code mit dem ich einen solchen Button erstelle:

Java:
private class MouseHandler extends MouseAdapter {
    public void mouseDoubleClick(MouseEvent e) {
        final Button b = new Button(desktop, SWT.PUSH);
        b.setText("Test");
        b.setLocation(e.x, e.y);
        b.pack();
        b.addMouseMoveListener(new MouseMoveListener() {
            public void mouseMove(MouseEvent e) {
                if (e.stateMask == SWT.BUTTON1) {
                    // hier positionieren				
                }
            }
        });
    }
}

MouseHandler ist eine innere Klasse, deren Instanz ich dem betreffenden Composite (Variablenname "desktop") als MouseListener zuweise. Wie man sieht, soll der Button dann verschoben werden, wenn man auf ihn klickt und die linke Maustaste gedrückt hält.

Mein Problem besteht jetzt darin, dass ich nicht weiß, wie man die Mausposition (e.x und e.y) so umrechnet, dass der Button immer unter dem Mauszeiger liegt. Unter Swing gibt es da ja extra eine Methode, die das übernimmt, weil das MouseEvent ja anscheinend immer zwei Points zurückliefert: einmal relativ zum Composite und einmal absolut auf dem Bildschirm.

Nachdem ich dazu bisher noch keine Code-Schnipsel gefunden habe, bitte ich jetzt euch darum, mir da das richtige Vorgehen zu erklären. Im Moment hab ich grad ein Brett vor Augen.

Danke,
Matthias
 
Hallo,

wie soll der Button denn unter dem Mauszeiger liegen? Genau an der Stelle an die du geklickt hast?

MFG

Sascha
 
Das wäre natürlich ideal, aber eigentlich würd's mir schon reichen, wenn der Button nicht einfach irgendwo im Programmfenster angezeigt würde, wenn ich ihn bewege, sondern eben da, wo sich ein grafisches Element befinden sollte, während man es verschiebt. Das kann fürs erste auch einfach der Punkt links oben vom Button sein. Ich will halt nur nicht haben, dass der Button ständig hin und her springt, was er ja tut, solange ich die Mauspositionen nicht richtig umgerechnet habe, und daran scheitert's bei mir ja grad.

Ich habe auch gerade ein Snippet von der SWT-Homepage nachprogrammiert, aber das war leider auch noch nicht des Rätsels Lösung, weil damit der Button nur verschoben wird, wenn man nicht darauf, sondern daneben hinklickt. (http://dev.eclipse.org/viewcvs/inde...g/eclipse/swt/snippets/Snippet46.java?view=co).
 
Vielleicht hilft dir das ja

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


public class SWTExample implements SelectionListener
{

  private Button tmp;
  
  public SWTExample()
  {
    Display display = new Display();
    Shell shell = new Shell(display);
    
    shell.setSize(300, 300);
    
    Button button = new  Button(shell, SWT.PUSH);
    button.setSize(50, 20);
    button.setText("1");
    button.setLocation(0, 0);
    
   
    
    button.addSelectionListener(this);
    button = new  Button(shell, SWT.PUSH);
    button.setSize(50, 20);
    button.setText("2");
    button.setLocation(50, 0);
    
   
    
    button.addSelectionListener(this);
    
    shell.addMouseMoveListener(new MouseMoveListener(){

      public void mouseMove(MouseEvent arg0)
      {
        if(tmp != null)
        tmp.setLocation(arg0.x, arg0.y);
      }
      
    });
    
    shell.setVisible(true);
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    display.dispose();
}
  
  public static void main(String[] args)
  {
   
    new SWTExample();
    
  }

  public void widgetDefaultSelected(SelectionEvent arg0)
  {
    
  }

  public void widgetSelected(SelectionEvent arg0)
  {
    tmp = (Button)arg0.getSource();
  }
  
}

MFG

Sascha
 
Ah, entschuldige. Ich glaube, du hast mich falsch verstanden. Ich möchte nicht auf den Button klicken und ihn dann verschieben, sondern ich möchte ihn bei gedrückter Maustaste verschieben. Also wie bei Drag&Drop nur, dass ich dazu nicht die SWT-interne Drag&Drop-Funktionalität verwenden möchte, weil es die in diesem Zusammenhang meines Erachtens nach nicht braucht.

Der Button, den ich bewegen möchte, soll außerdem nur ein Platzhalter sein. Eingentlich möchte ich jede andere mögliche Komponente ebenfalls verschieben könenn. Der Übersichtlichkeit halber beschränke ich mich aber nur auf einen Button.
 
Ok, ich bin doofer als die Polizei erlaubt. Es geht ganz einfach:

Java:
Point p1 = new Point(e.x, e.y);
Point l  = button.getLocation();
button.setLocation(l.x + p1.x, l.y + p1.y);

Danke aber für die Hilfe.
 
Zurück