# JFrame verschieben / Inhalt ändern



## kve (5. Nov 2007)

Hi!

Habe ein JFrame und den Inhalt des JFrames möchte ich nach dem verschieben aktualisieren. Meine Lösung bestand darin einen ComponentListener dem JFrame hinzuzufügen und die Events mittels componentMoved() abzufangen. Dabei gefällt mir allerdings nicht das die Aktionen unter componentMoved() wiederholt ausgeführt werden. Was ich haben möchte: solange man das Fenster verschiebt soll sich der Inhalt nicht verändern werden, erst beim "loslassen" des Fenstern soll sich der Inhalt aktualisiert werden.

Schöne Grüße


----------



## JPKI (5. Nov 2007)

Und wenn du einen ComponentListener mit einem MouseListener kombinierst? Der MouseListener setzt in mousePressed() ein Flag, und der ComponentListener weiss dann in componentMoved(), dass er warten muss, bis die Methode mouseReleased() aufgerufen wurde oder so ähnlich.


----------



## The_S (5. Nov 2007)

Seit wann funktioniert der MouseListener auf der, vom Betriebssystem gezeichneten, Titelleiste eines Fensters?


----------



## kve (5. Nov 2007)

Das mit dem Mouselistener hab ich auch schon überlegt, leider funktioniert dies aber nicht.


----------



## Guest (5. Nov 2007)

Eine mögliche Teil-Lösung wäre dann das man wie in http://forum.java.sun.com/thread.jspa?forumID=57&threadID=599181 vorgeht.


----------



## André Uhres (5. Nov 2007)

Versuch's mal mit einem Undecorated JFrame und selbstgemachter Titlebar:

```
package moving;
/*
 * MovingFrameDemo.java
 */

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

public class MovingFrameDemo extends JFrame {
    private JLabel jLabel1;
    private JPanel jPanel1;
    private JPanel jPanel2;
    private Point mp1;
    private Point p1;

    public MovingFrameDemo() {
        jPanel1 = new JPanel();
        jPanel2 = new JPanel();
        jLabel1 = new JLabel();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setUndecorated(true);
        jPanel1.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
        jPanel1.setPreferredSize(new Dimension(0, 30));
        jPanel1.addMouseListener(new MouseAdapterImpl());
        jPanel1.addMouseMotionListener(new MouseMotionAdapterImpl());
        getContentPane().add(jPanel1, BorderLayout.PAGE_START);
        jPanel2.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
        jLabel1.setPreferredSize(new Dimension(200, 22));
        jPanel2.add(jLabel1);
        getContentPane().add(jPanel2, BorderLayout.CENTER);
        setSize(400, 300);
        setLocationRelativeTo(null);
    }

    private void jPanel1MouseDragged(final MouseEvent evt) {
        Point p2 = getLocation();
        p2.translate(evt.getX() - mp1.x, evt.getY() - mp1.y);
        setLocation(p2);
    }

    private void jPanel1MousePressed(final MouseEvent evt) {
        mp1 = evt.getPoint();
        p1 = getLocation();
    }

    private void jPanel1MouseReleased(final MouseEvent evt) {
        if (!p1.equals(getLocation())) {
            jLabel1.setText(getLocation().toString());
        }
    }

    public static void main(final String args[]) {
        SwingUtilities.invokeLater(new RunMovingFrameDemo());
    }

    private class MouseAdapterImpl extends MouseAdapter {

        public MouseAdapterImpl() {
        }

        @Override
        public void mousePressed(final MouseEvent evt) {
            jPanel1MousePressed(evt);
        }

        @Override
        public void mouseReleased(final MouseEvent evt) {
            jPanel1MouseReleased(evt);
        }
    }

    private class MouseMotionAdapterImpl extends MouseMotionAdapter {

        public MouseMotionAdapterImpl() {
        }

        @Override
        public void mouseDragged(final MouseEvent evt) {
            jPanel1MouseDragged(evt);
        }
    }

    private static class RunMovingFrameDemo implements Runnable {

        public RunMovingFrameDemo() {
        }

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


----------

