IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Déplacer une JInternalFrame


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut Déplacer une JInternalFrame
    Bonjour,
    Dans un JDesktopPane, j'ai plusieurs fenêtres (extends JInternalFrame) que j'ai redéfini par :
    - re-écriture de la méthode paint pour donner à ma fenêtre un look totalement différent (fenêtre ronde)
    - suppression de la barre de titre (ui.setNorthPane(null))
    La suppression de la barre de titre entraine la suppression de la gestion du déplacement de la fenêtre par la souris et j'ai donc voulu re-implémenter celle-ci en ajoutant un addMouseMotionListener et plus précisemment un setLocation dans la méthode mouseDragged(). Mais cette implémentation amène à un comportement bizarre :
    - La détection du mouseDragged de la souris est ok => ok
    - La fenêtre bouge bien en même temps que la souris => ok
    - Le rafraichissement est mauvais et la fenêtre en cours de déplacement apparait successivement entre 2 positions : là où est la souris ou plus en haut à gauche => ko
    - plus j'éloigne la fenêtre de sa position d'origine et plus l'écart entre la position de la souris et la position de la fenêtre est différente => ko

    Merci d'avance pour votre aide.

    Voici mon code (simplifié ci-dessous) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public class FenetreSceneEtre extends JInternalFrame {
    	public FenetreSceneEtre() {
    		javax.swing.plaf.InternalFrameUI ui	= this.getUI();
    		((javax.swing.plaf.basic.BasicInternalFrameUI)ui).setNorthPane(null);
     
    		this.addMouseMotionListener(new MouseMotionListener() {
    			@Override
    			public void mouseDragged(MouseEvent e) {
    				setLocation(e.getPoint());
    			}
    			@Override
    			public void mouseMoved(MouseEvent e) {}
    		});
    	}
    	public void paint(Graphics g) {
    		if (g instanceof Graphics2D) {
    			Graphics2D g2d = (Graphics2D) g;
    			// Activation de l'anti-aliasing !
    			g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    		}
     
    		// ----------------------------------------
    		// DESSINER LE CERCLE ET SA COULEUR DE FOND
    		// ----------------------------------------
    		g.setColor(Color.BLACK);
    		g.drawOval(10, 10, 150, 150);
    		g.setColor(Color.BLUE);
    		g.fillOval(10, 10, 150, 150);
     
    		// ----------------------------------------
    		// DESSINER LES AUTRES COMPOSANTS
    		// ----------------------------------------
    		if(this.panel!=null)
    			this.panel.paintComponents(g);
    	}
      }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut
    Je viens de corriger en grande partie mon problème. En fait il y a plusieurs coordonnées (x,y) dans mon IHM :
    - celle de la souris dans le composant auquel on a mis le addMouseMotionListener (ma FenetreSceneEtre qui hérite de JInternalFrame dans mon cas) => e.getPoint()
    - celle de la souris à l'écran => e.getLocationOnScreen()
    - celle de la souris dans le JDesktopPane qui contient les JInternalFrame
    Et en utilisant le 3ème système de coordonnées, j'arrive à une solution (presque) bonne. En effet maintenant la JInternalFrame se balade bien (mouseDragged) selon la souris et sans pb de rafraichissement. Par contre au tout début du mouseDragged, la fenêtre fait un décalage correspondant apparemment à la position de la souris dans la fenetre (e.getPoint). Et ce décalage ne se fait que lors du 1er mouvement de la souris, ensuite c'est ok. Je verrai plus tard comment corriger ce bug sauf si quelqu'un a une idée bien évidemment.

    Voici mon code corrigé (bureau.getPanel().getPanelBureau() pointe vers le JDesktopPane).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    this.addMouseMotionListener(new MouseMotionListener() {
    	@Override
    	public void mouseDragged(MouseEvent e) {
    		setLocation(bureau.getPanel().getPanelBureau().getMousePosition());
    	}
    	@Override
    	public void mouseMoved(MouseEvent e) {}
    });

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    En effet dans une application il y a plusieurs niveaux de coordonnées :
    • On a les coordonnées par rapport à l'écran, qui sont généralement utilisé pour placer les fenêtres.
    • Puis chaque composant à son propre système de coordonnées, à partir de son point en haut à droite.



    Ta première solution ne fonctionnait pas car tu déplaçais ta fenêtre par rapport aux coordonnées de ta fenêtre qui changeait en même temps que son déplacement...

    Ta seconde solution est mieux car tu te bases sur un plan fixe (le plan du composant parent apparemment), mais ton bug vient du fait qu'au tout début tu déplaces la fenêtre directement à l'emplacement du curseur...


    En fait il faut que tu captures le clic pour récupérer le point d'origine (position de la fenêtre et position sur l'écran), puis effectué tes déplacement à partir de ce point d'origine par rapport aux déplacements effectué sur l'écran.


    Grosso-modo cela donne quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    MouseAdapter adapter = new MouseAdapter() {
     
    	// Le point d'origine (calculé lors du premier clic) :
    	private Point origin;
     
    	@Override
    	public void mousePressed(MouseEvent e) {
    		// On récupère la position du composant dans le parent
    		Point p = e.getComponent().getLocation();
    		// On récupère la position de la souris à l'écran
    		Point s = e.getLocationOnScreen();
     
    		// On calcule un point d'origine par rapport à ces deux infos :
    		this.origin = new Point(p.x - s.x, p.y - s.y);
    	}
     
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		this.origin = null;
    	}
     
    	@Override
    	public void mouseDragged(MouseEvent e) {
    		if (this.origin != null) {
    			Point p = e.getLocationOnScreen();
    			e.getComponent()
    					.setLocation(origin.x + p.x, origin.y + p.y);
    		}
    	}
    };
     
    this.addMouseMotionListener(adapter);
    this.addMouseListener(adapter);
    a++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut
    J'avais bien pensé à l'idée de capturer la position initiale mais je me demandais comment l'implémenter, merci donc pour tes conseils car cela marche parfaitement :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Focus] Probleme pour selectionner une JInternalFrame
    Par bulbo dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/05/2009, 13h22
  2. Comment ajouter une icone à une JInternalFrame
    Par wassimb dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 12/07/2006, 15h13
  3. [JInternalFrame] Enlever la Barre de Titre d'une JInternalFrame
    Par tchoukapi dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 05/09/2005, 12h37
  4. Déplacer une TImage avec la souris
    Par Ingelishome dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/03/2005, 14h16
  5. Taille minimum pour une JFrame ou une JInternalFrame
    Par sixkiller dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 30/11/2004, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo