JFrame verschieben / Inhalt ändern

  • Themenstarter Themenstarter kve
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
K

kve

Gast
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
 
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.
 
Seit wann funktioniert der MouseListener auf der, vom Betriebssystem gezeichneten, Titelleiste eines Fensters?
 
Das mit dem Mouselistener hab ich auch schon überlegt, leider funktioniert dies aber nicht. 🙂
 
Versuch's mal mit einem Undecorated JFrame und selbstgemachter Titlebar:
Code:
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);
        }
    }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben