Drag&Drop auf JFrame

moemaster

Erfahrenes Mitglied
Moin,
ich habe gerade mal ein wenig mit MouseMotionListenern rumgespielt und dachte mir dann, dass ich einfach mal ein JPanel auf einem JFrame herziehe und somit dessen Position verändere. Klappt allerdings nur so halb... Immer wenn ich das Panel ziehe, verändert es zwar seine Position, allerdings "flackert es die ganze Zeit und springt hin und her, wenn ich die Maus bewege. Steht der Mauszeiger still, hört das Springen meistens auf. Woran kann das liegen? Um mein Problem ein wenig deutlicher zu machen, geb ich euch hier mal meinen Code:
Code:
import java.awt.Color;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.Border;

public class DragDrop extends JFrame{

	JPanel pnlTest = new JPanel();
	
	Border border = BorderFactory.createLineBorder(Color.black);
	
	public static void main(String [] args){
		DragDrop frame1 = new DragDrop();
		frame1.initialize();
	}
	
	public void initialize(){
		setLayout(null);
		setBounds(10,10,800,600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		setUndecorated(true);
		setVisible(true);
		
		add(pnlTest);
	}
	
	public DragDrop(){
		pnlTest.setBounds(0, 0, 200, 120);
		pnlTest.setBorder(border);
		pnlTest.addMouseMotionListener(new MouseMotionListener(){
			public void mouseDragged(MouseEvent e) {
				pnlTest.setBounds(e.getX()+100, e.getY()+60, 200, 120);
			}
			public void mouseMoved(MouseEvent arg0) {}
		});
	}
}

Für Hilfe wäre ich sehr dankbar :o)
Beste Grüße aus Hamburg
 
Warum benutzt du nicht das Java Drg&Drop Paket?
Vielleicht hilft dir dieser Beitrag: http://forum.netzgemein.de/ftopic34.html
Anstelle das Buttons kann man auch ein Panel einfügen, dazu musst du allerdings die ViewTransferable ein wenig anpassen.
Und zwar so, dass du ihm ein Panel übergibst.
Ich weiß allerdings nicht ob man als dropTarget ein Frame benutzen kann.
 
Hallo,
dein Fehler in dem Programm ist, dass du die relativen Koordinaten der Maus innerhalb des Frames auf die Koordinaten des Desktops anwendest.

Beispiel:
Du Klicks mit der Maus auf die Koordinaten "30, 30" des Fensters. Das Fenster springt in diesem Moment zu den Koordinaten "30, 30" des Desktops. Deshalb musst du die "Anklickkoordinaten" im Fenster von den Koordinaten der Maus vom Desktop abziehen.

Hier hab ich dir mal einen Code geschrieben, der das macht (ist in Worten ziemlich blöd zu erklären):

Java:
import java.awt.DisplayMode;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Foo extends JFrame {
	private int touchX = 0, touchY = 0;
	private boolean keepInsideScreen = true;

	public static void main(String[] args) {
		new Foo();
	}

	public Foo() {
		setSize(800, 600);
		setLocationRelativeTo(null);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		addMouseListener(new MouseInputHandler());
		addMouseMotionListener(new MouseMotionHandler());

		setVisible(true);
	}

	private class MouseInputHandler extends MouseAdapter {
		@Override
		public void mousePressed(MouseEvent e) {
			touchX = e.getX();
			touchY = e.getY();
		}
	}

	private class MouseMotionHandler extends MouseMotionAdapter {
		@Override
		public void mouseDragged(MouseEvent e) {
			int x = e.getXOnScreen() - touchX;
			int y = e.getYOnScreen() - touchY;

			if (keepInsideScreen) {
				DisplayMode dm = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode();
				int screenWidth = dm.getWidth();
				int screenHeight = dm.getHeight();

				if (x < 0) {
					x = 0;
				} else if (x > screenWidth - getWidth()) {
					x = screenWidth - getWidth();
				}

				if (y < 0) {
					y = 0;
				} else if (y > screenHeight - getHeight()) {
					y = screenHeight - getHeight();
				}
			}

			setLocation(x, y);
		}
	}
}
 
Zuletzt bearbeitet:
Zurück