Drag and Drop Problem

Also ich habe ein ähnliches Problem, und zwar versuche ich eine Art Drag&Drop zu implementieren. Ich halte den MouseButton auf ein JLabel gedrückt und erzeuge ein JWindow oder ein JFrame (ich erwähne beides, da keines den gewünschten Erfolg brachte), wobei nun bei gedrückt gehaltenen Button der Focus auf eine JComponent auf dem erzeugten JWindow/JFrame gesetzt werden soll.

Hat jemand vll einen kleinen Code-Schnippsel parat?

eigentlich einfach, wenn gedrückt dann andere Componente requestFocus();

EagleEye : "eigentlich einfach, wenn gedrückt dann andere Componente requestFocus(); "

So habe ich es ja gemacht, aber leider klappt das nicht. Ich bekomme den Focus nicht auf’s JLabel.

Ein Label reagiert nicht auf Eingabeerreignisse. Daher kann es nicht den Fokus bekommen. Versuch’s mal mit einem JButton.

Das ein JLabel den Focus nicht bekommen, kam mir so langsam zwar auch in den Sinn, aber dennoch steht mir ja requestFocus() zur Verfügung. Wie kann ich es denn umsetzen, dass wenn bei gedrückten MouseButton ein Window mit einem Label darauf erzeugt wird und ich dann OHNE neu auf das window(oder einer der sich darauf befindlichen components) zu klicken, ich mit der Maus das Window weiter bewegen kann? MouseListener geht ja bei Label. Und es funktioniert auch sonst alles, nur ich muß bis jetzt auf das Label auf dem erzeugten Window neu klicken, um es zu bewegen.

MouseMotionListener → mouseDragged → setLocation
Den Listener hängen wir an das Original. Wenn nötig, können wir das MouseEvent mit dispatchEvent auch an JWindow weiterleiten, das dann auch einen Listener bekommen muss.

Ich hab das jetzt mal mit dem dispatchEvent probiert, aber ich würde es auch gern ohne hinbekommen und das nur über das window regeln.

Wenn ich das mit dispatchEvent mache, dann bekomme ich folgende Exception :
“Exception in thread “AWT-EventQueue-0” java.lang.StackOverflowError”

Ich reiche jetzt vorerst das event über window.mouseDragged(event) weiter.

Den Focus habe ich auf das Window gesetzt bekommen, aber leider bringt das wohl nichts allein, da das MouseEvent immer noch vom MainComponent ausgelöst wird. Kann ich nicht irgendwie da etwas manipulieren?

Versuch’s mal so:

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

public class DragWindowDemo extends JFrame {

    private JPanel mainpanel;
    private JTextField textfield;
    private JWindow dragWindow;

    public DragWindowDemo() {
        super("DragWindowDemo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        textfield = new JTextField("JTextField");
        mainpanel = new JPanel(null);
        getContentPane().add(textfield, BorderLayout.PAGE_START);
        getContentPane().add(mainpanel);
        textfield.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(final MouseEvent evt) {
                drag(evt.getLocationOnScreen());
            }

            @Override
            public void mouseReleased(final MouseEvent evt) {
                drop(evt.getPoint());
            }
        });
        textfield.addMouseMotionListener(new MouseMotionAdapter() {

            @Override
            public void mouseDragged(final MouseEvent evt) {
                dragWindow.setLocation(evt.getLocationOnScreen());
            }
        });
    }

    private void drag(final Point location) {
        dragWindow = new JWindow(this);
        JLabel lb = new JLabel();
        lb.setOpaque(true);
        lb.setText(textfield.getText());
        lb.setBackground(Color.YELLOW);
        dragWindow.add(lb);
        dragWindow.setSize(textfield.getSize());
        dragWindow.setLocation(location);
        dragWindow.setVisible(true);
    }

    private void drop(final Point location) {
        Component component = dragWindow.getComponent(0);
        location.translate(-mainpanel.getX(), -mainpanel.getY());
        component.setLocation(location);
        mainpanel.add(component);
        dragWindow.dispose();
    }

    public static void main(final String args[]) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new DragWindowDemo().setVisible(true);
            }
        });
    }
}```

Danke Andre, vom Prinzip her habe ich es auch jetzt genauso gemacht. Hätte halt nur gern die source-component etwas außen vor gelassen, so dass ich nur den MouseMotionListener des window genutzt hätte.

Aber vielen Dank !!!