2009-05-17 11 views
16

Ich suchte im Web nach Beispielen für ziehbare Swing-Komponenten, , aber ich fand entweder unvollständige oder nicht funktionierende Beispiele.Swing: Erstellen einer ziehbaren Komponente ...?

Was ich brauche, ist ein Swing-Komponente die gezogen durch die Maus innerhalb einer anderen Komponente sein kann. Während es gezogen wird, sollte es bereits ändern seine Position, nicht nur 'zu seinem Ziel' springen '.

Ich würde gerne Beispiele, die ohne Nicht-Standard-APIs arbeiten.

Vielen Dank.

Antwort

29

schlage ich eine einfache, aber gut funktionierende Lösung, von mir fand heraus;)

Was kann ich tun?

  • Wenn die Maus gedrückt wird, zeichne ich den Position des Cursors auf dem Bildschirm und die Position der Komponente.
  • Wenn die Maus gezogen wird, berechne ich die Differenz zwischen neuen und alten Position des Cursors auf dem Bildschirm , und bewegen Sie die Komponente durch diesen Unterschied.

Getestet mit neuester JDK 6 unter Linux (OpenSuse, KDE3),
aber hey, es ist Java Swing, sollte überall gleich arbeiten.

geht hier den Code:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class MyDraggableComponent 
    extends JComponent { 

    private volatile int screenX = 0; 
    private volatile int screenY = 0; 
    private volatile int myX = 0; 
    private volatile int myY = 0; 

    public MyDraggableComponent() { 
    setBorder(new LineBorder(Color.BLUE, 3)); 
    setBackground(Color.WHITE); 
    setBounds(0, 0, 100, 100); 
    setOpaque(false); 

    addMouseListener(new MouseListener() { 

     @Override 
     public void mouseClicked(MouseEvent e) { } 

     @Override 
     public void mousePressed(MouseEvent e) { 
     screenX = e.getXOnScreen(); 
     screenY = e.getYOnScreen(); 

     myX = getX(); 
     myY = getY(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { } 

     @Override 
     public void mouseEntered(MouseEvent e) { } 

     @Override 
     public void mouseExited(MouseEvent e) { } 

    }); 
    addMouseMotionListener(new MouseMotionListener() { 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     int deltaX = e.getXOnScreen() - screenX; 
     int deltaY = e.getYOnScreen() - screenY; 

     setLocation(myX + deltaX, myY + deltaY); 
     } 

     @Override 
     public void mouseMoved(MouseEvent e) { } 

    }); 
    } 

} 

public class Main { 

    public static void main(String[] args) { 
    JFrame f = new JFrame("Swing Hello World"); 

    // by doing this, we prevent Swing from resizing 
    // our nice component 
    f.setLayout(null); 

    MyDraggableComponent mc = new MyDraggableComponent(); 
    f.add(mc); 

    f.setSize(500, 500); 

    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    f.setVisible(true); 
    } 

} 
+0

ich perfekt und präzise funktioniert. Danke, dass du meinen Tag gerettet hast. – Dhanushka

1

Auch fand ich heraus, dass man eine JInternalFrame innerhalb eines JFrame, schaffen könnte, aber das Problem ist: Sie bekommen immer ein ärgerlich Fenstertitel Bar.

die Titelleiste zu deaktivieren, leider eine schmutzige Abhilfe ist notwendig:

public class MyDraggableComponent extends JInternalFrame { 

    public MyDraggableComponent() { 
    InternalFrameUI thisUI = getUI(); 
    if (thisUI instanceof BasicInternalFrameUI) { 
     ((BasicInternalFrameUI) thisUI).setNorthPane(null); 
    } 

} 

Ich vermisse wirklich eine Methode, wie "someInternalFrame.setWindowTitleBar (false)" ...
: '(

+2

Subclassing könnte die 'setWindowTitleBar()' Methode liefern! – 11684

1

Hier ist ein weiterer Ansatz, den Sie vielleicht ausprobieren möchten.Ich denke, es ist ziemlich sauber.Einfach die folgende Klasse kopieren und wie diese verwenden:

Verbrauch:

DragListener dl = new DragListener(componentOrWindowToBeMoved); dl.addHandle(componentToPickWithTheMouse);

Klasse:

import java.awt.Component; 
import java.awt.MouseInfo; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class DragListener extends MouseAdapter { 

    private final Component COMPONENT_TO_DRAG; 
    private final int MOUSE_BUTTON; 
    private Point mousePosition; 
    private Point sourceLocation; 
    private Point locationOnScreen; 
    private int buttonPressed; 

    public DragListener(final Component componentToDrag) { 
     this(componentToDrag, MouseEvent.BUTTON1); 
    } 

    public DragListener(final Component componentToDrag, final int mouseButton)       { 
     this.COMPONENT_TO_DRAG = componentToDrag; 
     this.MOUSE_BUTTON = mouseButton; 
    } 

    @Override 
    public void mousePressed(final MouseEvent e) { 
     this.buttonPressed = e.getButton(); 
     this.mousePosition = MouseInfo.getPointerInfo().getLocation(); 
     this.sourceLocation = new Point(); 
    } 

    @Override 
    public void mouseDragged(final MouseEvent e) { 
     if (this.buttonPressed == MOUSE_BUTTON) { 
      this.locationOnScreen = e.getLocationOnScreen(); 
      this.sourceLocation = this.COMPONENT_TO_DRAG.getLocation(this.sourceLocation); 
      this.sourceLocation.translate((int) (this.locationOnScreen.getX() - this.mousePosition.getX()), (int) (this.locationOnScreen.getY() - this.mousePosition.getY())); 
      this.COMPONENT_TO_DRAG.setLocation(this.sourceLocation); 
      this.mousePosition = MouseInfo.getPointerInfo().getLocation(); 
     } 
    } 

    public void addHandle(Component handle) { 
     handle.addMouseListener(this); 
     handle.addMouseMotionListener(this); 
    } 
} 
Verwandte Themen