# JFrame Fenster bewegen



## Einbock (30. Apr 2011)

Guten Tag.

Ich habe ein JFrame Fenster erzeugt und es auf setUndecorated(true) gesetzt.
Jetzt besteht aber das Problem, dass ich das Fenster nicht bewegen bzw. verschieben kann.
Wie kann ich diese Funktion bzw. diese Eigenschaft wieder freischalten?

Vielen Dank für jede Hilfe.


----------



## L-ectron-X (30. Apr 2011)

Häng einen MouseMotionListener dran, dann kannste das auch wieder verschieben.


----------



## Einbock (30. Apr 2011)

Danke, dass du dich meldest L-ectron-X 

Okey, das Hinzufügen des MouseMotionListeners sollte kein Problem sein, aber wie teile ich dem Fenster mit, dass er verschoben werden soll.
Mit Fenster.setBounds(e.getX(), e.getY(), 300, 200) in der Methode MouseDragged(MouseEvent e) erreiche ich nur schlechte Ergebnisse.

Danke


----------



## s4ke (30. Apr 2011)

Vielleicht hilft das:

Bei Klick die Koordinaten abfragen und abspeichern. Und dann mit der Differenz des Events und diesen Koordinaten arbeiten.

EDIT: Kommando zurück, ich arbeite gerade an ner Lösung.


----------



## Simon_Flagg (30. Apr 2011)

setPosition oder so ähnlich


----------



## s4ke (30. Apr 2011)

[Java]import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

public class Main 
{
	private static int x_coordEvent=-1;
	private static int y_coordEvent=-1;
	private static JFrame frame;

	public static void main(String args[])
	{
		frame = new JFrame("Drag me!");
		frame.getContentPane().setLayout(null);
		frame.setUndecorated(true);
		frame.pack();
		frame.setSize(300,200);
		frame.setLocationRelativeTo(null);
		frame.addMouseMotionListener(new MouseMotionListener()
		{
			public void mouseDragged(MouseEvent e) 
			{
				if(x_coordEvent==-1 || y_coordEvent==-1)
				{
					System.out.println("Initializing");
					x_coordEvent = e.getX();
					y_coordEvent = e.getY();
				}
				PointerInfo pointerInfo = MouseInfo.getPointerInfo();
				Point point  = pointerInfo.getLocation();
				int x = (int)point.getX();
				int y = (int)point.getY();
				frame.setLocation(x-x_coordEvent, y-y_coordEvent);
			}
			public void mouseMoved(MouseEvent e) 
			{
				System.out.println("Resetting");
				x_coordEvent = -1;
				y_coordEvent = -1;
			}			
		});
		frame.setVisible(true);
	}
}
[/Java]

Das ist mal ein kleines Beispiel. Der Zeiger bleibt immer an der gleichen relativen Position im Fenster. Das erreiche ich durch die Bestimmung der Position bei -1. Aber das Problem daran ist aber noch, dass das nur für den ersten Fall geht...

EDIT: Manchmal ist es aber auch wirklich einfach... Einfach mit der mouseMoved Methode immer zurücksetzen.


----------



## L-ectron-X (30. Apr 2011)

Es gibt viele mögliche Lösungen. Hier noch eine andere:

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

public class MoveFrame extends JFrame {
  private Point evtPoint;
  private int xPos, yPos;
  
  public MoveFrame() {
    this.setUndecorated(true);
    this.setSize(800, 600);
    this.setLocationRelativeTo(null);

    this.addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        xPos = getBounds().x;
        yPos = getBounds().y;
        evtPoint = e.getPoint();
      }
    });
    
    this.addMouseMotionListener(new MouseMotionAdapter() {
      public void mouseDragged(MouseEvent e) {
        if(e.getX() < evtPoint.x) {
          setLocation(xPos--, yPos);
        }
        if(e.getX() > evtPoint.x) {
          setLocation(xPos++, yPos);
        }
        if(e.getY() < evtPoint.y) {
          setLocation(xPos, yPos--);
        }
        if(e.getY() > evtPoint.y) {
          setLocation(xPos, yPos++);
        }
      }
    });
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new MoveFrame().setVisible(true);
      }
    });
  }
}
```


----------



## s4ke (30. Apr 2011)

Was gerade eben entstanden ist, weil mir langweilig war (Auf Basis von dem oben geposteten)...

https://rapidshare.com/files/459981222/OnScreenSnake.jar

EDIT: Da war ein kleiner Fehler, hier der richtige:

http://chili-martin.co.de/file_download/7/OnScreenSnake.jar


----------



## s4ke (1. Mai 2011)

Ohne jetzt irgendwie neidisch auf deine Lösung zu sein: Deine Version funktioniert aber nicht akkurat, bzw. so wie man sich das normalerweise vorstellt.


----------

