Drag-Evente nach Container wechsel

HalloWelt_

Mitglied
Hallo.
Mein Problem ist folgendes:
Ich habe mehrere JComponenten welche durch einen Klick ihren Container verlieren und zu einem JPanel (welches die gesamte Benutzeroberfläche enthält) hinzugefügt wird.
Der JComponent soll nun über das JPanel gezogen werden bis die Maus wieder losgelassen wurde.
Leider empfängt der JComponent (und auch das JPanel) erst wieder Move-Evente wenn die Maus losgelassen wurde. (Das entsprechende Realeased-Event kommt auch noch nicht an)
Zusammengefasst:
  1. Man klickt auf den JComponent
  2. Der JComponent wechselt seinen Container
  3. Man muss die Maus wieder loslassen
  4. Erst jetzt kommen Move-Evente welche den JComponenten bewegen

Ich möchte jedoch, dass der Benutzer einmal auf den JComponent klickt, der seinen Container wechselt, und dann sofort Move-Evente kommen ohne dass der Benutzer die Maus erst loslassen muss.

Kann man dass irgendwie realisieren?
Ich schätze, dass das an der Art wie ein Container seine Evente verarbeitet und weitergibt liegt, und nur schwer zu manipulieren ist..

Vielen Dank!
Grüße, HalloWelt_
 

HalloWelt_

Mitglied
Ich habe mal ein kleines Programm geschrieben, welches das Problem besser beschreiben könnte.

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test implements Runnable {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test());
    }

    @Override
    public void run() {
        final JPanel dragArea = new JPanel(null);
        final JPanel view = new JPanel(new BorderLayout());
        final DragPane drag = new DragPane(view);
        final JButton button = new JButton("Make a clone");

        button.setSize(button.getPreferredSize());
        dragArea.add(button);

        view.add(dragArea, BorderLayout.CENTER);
        view.add(createTestPanel(), BorderLayout.SOUTH);

        button.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent evt) {
                JButton clone = createTestButton();
                drag.setDrag(clone, button.getParent(), button.getLocation(), evt.getPoint(),
                        new DragPane.DragFinishedHandler() {

                            @Override
                            public void dragFinished(DragPane pane, Component c, Point location) {
                                c.setLocation(SwingUtilities.convertPoint(pane, location, dragArea));
                                dragArea.add(c);
                            }
                        });
            }
        });

        JFrame frm = new JFrame("Test");
        frm.setLocationByPlatform(true);
        frm.setContentPane(drag);
        frm.setSize(600, 400);
        frm.setVisible(true);
    }

    private static JButton createTestButton() {
        return new JButton("Drag me");
    }

    private static JPanel createTestPanel() {
        JPanel south = new JPanel();
        for (int i = 0; i < 6; i++) {
            south.add(new JButton("Button " + i));
        }
        return south;
    }
}

class DragPane extends JPanel {

    private final Component view;
    private final DragGlassPane glassPane;
    private Component drag;
    private Point dragOff;

    public static interface DragFinishedHandler {

        public void dragFinished(DragPane pane, Component c, Point location);
    }

    public DragPane(Component c) {
        super(null);
        glassPane = new DragGlassPane();
        view = c;
        add(c);

        glassPane.addMouseMotionListener(new MouseMotionListener() {

            @Override
            public void mouseDragged(MouseEvent me) {
                handleEvent(me, 0, 0);
            }

            @Override
            public void mouseMoved(MouseEvent me) {
                handleEvent(me, 0, 0);
            }
        });
    }

    public Component getView() {
        return view;
    }

    private void handleEvent(MouseEvent evt, int dx, int dy) {
        drag.setLocation(evt.getX() - dragOff.x + dx, evt.getY() - dragOff.y + dy);
    }

    @Override
    public Dimension getPreferredSize() {
        return view.getPreferredSize();
    }

    @Override
    public void doLayout() {
        for (Component c : getComponents()) {
            if (c == glassPane || c == view) {
                c.setSize(getSize());
            }
        }
    }

    public static DragPane getDragPane(Component c) {
        Container cont = c.getParent();
        while (cont != null) {
            if (cont instanceof DragPane) {
                return (DragPane) cont;
            }

            cont = cont.getParent();
        }
        return null;
    }

    private static Point getLocationOnDragPane(Component c) {
        Point p = new Point(c.getLocation());
        Container cont = c.getParent();
        while (cont != null) {
            p.x += cont.getX();
            p.y += cont.getY();
            cont = cont.getParent();
            if (cont instanceof DragPane) {
                break;
            }
        }
        return p;
    }

    public void setDrag(Component c, Container cont, Point relLocation, Point off,
            final DragFinishedHandler handler) {
        if (drag != null) {
            return;
        }

        Point loc = getLocationOnDragPane(cont);
        loc.translate(relLocation.x, relLocation.y);

        drag = c;
        dragOff = off;
        add(glassPane, 0);

        add(c, 0);
        c.setLocation(loc);
        c.setSize(c.getPreferredSize());

        final MouseMotionListener motion = new MouseMotionListener() {

            @Override
            public void mouseDragged(MouseEvent me) {
                handleEvent(me, drag.getX(), drag.getY());
            }

            @Override
            public void mouseMoved(MouseEvent me) {
                handleEvent(me, drag.getX(), drag.getY());
            }
        };
        final MouseListener mouse = new MouseAdapter() {

            @Override
            public void mouseReleased(MouseEvent evt) {
                stopDrag(motion, this, handler);
            }
        };
        glassPane.addMouseListener(mouse);
        drag.addMouseMotionListener(motion);
        drag.addMouseListener(mouse);
        doLayout();
    }

    private void stopDrag(MouseMotionListener motion, MouseListener mouse, DragFinishedHandler handler) {
        drag.removeMouseMotionListener(motion);
        drag.removeMouseListener(mouse);
        glassPane.removeMouseListener(mouse);
        Point p = drag.getLocation();
        remove(drag);
        remove(glassPane);
        handler.dragFinished(this, drag, p);

        drag = null;
        repaint();
    }

    private class DragGlassPane extends JPanel {

        public DragGlassPane() {
            super(null);
            setOpaque(false);
        }
    }
}

Wenn man auf den "Make a clone" JButton klickt kommt der neue "Drag me" JButton.
Die Evente werden aber erst wieder an das DragPane (oder dem "Drag me" JButton) geschickt, wenn
man den "Make a clone" JButton loslässt.

Auch der "Make a clone" JButton bekommt keine Drag/Move Evente während man ihn gedrückt hält.
(Wenn das so wäre könnte man diese Evente verwenden; geht aber nicht)

Grüße, HalloWelt_
 

HalloWelt_

Mitglied
Ich habe es nun so gelöst:

Java:
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueue() {

    protected void dispatchEvent(AWTEvent event) {
        // Dieses Event kann man nun selbst behandeln
        // ...

        super.dispatchEvent(event);
    }
});
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen Spaltenbreite bei drag nicht änderbar AWT, Swing, JavaFX & SWT 4
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
AmsananKING ListView Drag And Drop AWT, Swing, JavaFX & SWT 0
AmsananKING Drag And Drop Filenames Inside A Listview AWT, Swing, JavaFX & SWT 1
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
F Drag&Drop mit Transparenter Farbe bei PNG AWT, Swing, JavaFX & SWT 0
D JavaFX Pane per Drag&Drop bewegen? AWT, Swing, JavaFX & SWT 2
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
F Drag und Drop AWT, Swing, JavaFX & SWT 0
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
L JavaFX JavaFX Chart Drag and Drop AWT, Swing, JavaFX & SWT 3
D JavaFX Drag&Drop mehrerer TreeViews oder TableViews AWT, Swing, JavaFX & SWT 1
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
U Drag and Drop mit imageview AWT, Swing, JavaFX & SWT 0
U Drag and Drop imageviews AWT, Swing, JavaFX & SWT 8
D SteelSeries in Netbeans als Drag-and-Drop einbinden AWT, Swing, JavaFX & SWT 0
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
S Swing Suche Drag & Drop Beispiele AWT, Swing, JavaFX & SWT 1
H Drag component out of window AWT, Swing, JavaFX & SWT 1
A Drag and Drop mit JAVAFX- Scenebuilder AWT, Swing, JavaFX & SWT 1
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
R Drag and Drop Problem auf Jpanel AWT, Swing, JavaFX & SWT 2
N Swing JTable und Drag und Drop AWT, Swing, JavaFX & SWT 2
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
C Drag and Drop (inventar) AWT, Swing, JavaFX & SWT 15
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
Iron Monkey JFileChooser - Drag and Drop AWT, Swing, JavaFX & SWT 5
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
HaukeG Swing Drag & Drop in verschiedenen Varianten AWT, Swing, JavaFX & SWT 4
S Swing Drag&Drop mit TransferHandler und JPanels AWT, Swing, JavaFX & SWT 8
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
R Drag 'n Drop AWT, Swing, JavaFX & SWT 3
S Selektion bei Drag&Drop AWT, Swing, JavaFX & SWT 4
D Drag-Action: Innerhalb meiner View? AWT, Swing, JavaFX & SWT 3
C Swing Drag and Drop mit Objekten in einem Fenster. AWT, Swing, JavaFX & SWT 9
T SWT Drag&Drop: Eclipse FileTransfer mit Icons AWT, Swing, JavaFX & SWT 14
F Drag & Drop durch Verbindungslinien AWT, Swing, JavaFX & SWT 10
T Swing Drag and Drop - JLabels tauschen statt überschreiben AWT, Swing, JavaFX & SWT 11
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
B Drag and Drop AWT, Swing, JavaFX & SWT 6
K Drag and Drop Workbench AWT, Swing, JavaFX & SWT 2
P SWT Eclipse Draw2D Drag and Drop (ruckelt) AWT, Swing, JavaFX & SWT 4
F SWT Drag and Drop im TreeViewer AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
A TransferHandler & Drag n' Drop AWT, Swing, JavaFX & SWT 2
R Drag an Drop JTable Zelle AWT, Swing, JavaFX & SWT 6
D Drag & Drop - node.isRoot AWT, Swing, JavaFX & SWT 3
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
S Drag wie bei JToolbar mit JPanel AWT, Swing, JavaFX & SWT 3
E Swing Beim Drag & Drop, Drag verbieten?! AWT, Swing, JavaFX & SWT 2
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
F Swing Problem mit Drag&Drop in JTable AWT, Swing, JavaFX & SWT 4
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
E Drag&Drop zwischen 2 Listen AWT, Swing, JavaFX & SWT 5
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
T Swing JInternal Frame Clippingfehler bei drag AWT, Swing, JavaFX & SWT 4
M Swing JTable Drag'n'Drop von Dateien AWT, Swing, JavaFX & SWT 3
M Drag and Drop: Quellfenster AWT, Swing, JavaFX & SWT 2
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
M Swing JList > Drag & Drop AWT, Swing, JavaFX & SWT 2
J Drag&Dropt mit Swing AWT, Swing, JavaFX & SWT 3
C Drag an Drop vom JTree zur JTable AWT, Swing, JavaFX & SWT 4
S Swing DnD: Image während Drag-Operation ändern AWT, Swing, JavaFX & SWT 3
Z Drag and Drop auf Application AWT, Swing, JavaFX & SWT 3
S Swing DnD: Wie finde ich heraus, von welcher Zelle aus im JTable der Drag gestartet wurde? AWT, Swing, JavaFX & SWT 3
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
H Drag&Drop von JComponents AWT, Swing, JavaFX & SWT 6
G JTable drag and drop AWT, Swing, JavaFX & SWT 4
H Drag&Drop mit GWT AWT, Swing, JavaFX & SWT 8
B Swing Drag&Drop einzelner Zellen in einer JTable AWT, Swing, JavaFX & SWT 12
A Swing Drag and Drop TreeNode User Object AWT, Swing, JavaFX & SWT 3
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
K Swing Wie ändere ich die default action für Drag&Drop AWT, Swing, JavaFX & SWT 6
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
V SWT TreeViewer Drag'n'Drop LocalSelectionTransfer AWT, Swing, JavaFX & SWT 10
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
F Drag & Drop mit eigenen Komponenten AWT, Swing, JavaFX & SWT 2
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
S Drag'n'Drop AWT, Swing, JavaFX & SWT 8
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
M Drag & Drop in Swing (createTransferable) AWT, Swing, JavaFX & SWT 6
T Drag Quelle beim Drop AWT, Swing, JavaFX & SWT 6
A Drag & Drop von Zeilen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 2
E Drag & Drop von jTree in JList AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben