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

AWT/Swing Java Discussion :

Déplacement d'un label accompagné d'un JTextField


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Par défaut Déplacement d'un label accompagné d'un JTextField
    Bonsoir,
    Je suis un nouveau menbre de ce forum. Ce qui m'a poussé à m'inscrire est dû à un probléme qui traine depuis fort longtemps.
    J'ai créée une fenétre avec un label "nom" suivi d'une zone de saisie en premier lieu. Je veux déplacer le "nom" suivi d'une zone de saisie, en enfonçant le bouton gauche de la souris. Ca fait des semaines que je fais des recherches sur cela à travers les forums et les tuto mais j'ai du mal à trouver les bonnes solutions.

    Voici ici un exemple :
    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
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
     
    public class Test extends JFrame {
        String[] genre = {" Masculin ", " Feminin "};
     
      public Test(){      
        this.setTitle("Deplacement");
        this.setSize(500, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);      
        this.getContentPane().setLayout(new FlowLayout());
       add(new JLabel("Nom:"));
       add(new JTextField(10));
       add(new JLabel("Prénom:"));
       add(new JTextField(12));
       add(new JLabel("  Sexe:"));
       add(new JComboBox(genre));
     
        this.setVisible(true);      
      }
     
      public static void main(String[] main){
        Test fen = new Test();
      }   
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Bienvenue sur le forum Developpez.

    Pour déplacer un composant, il faut déjà définir ce qu'on entend par déplacer. S'il s'agit de modifier ses coordonnées de manière continue (on pourrait aussi entendre par déplacer, changer l'ordre d'affichage des différents couples label/field), il faut d'abord se passer de Layout Manager, parce que celui-ci décide justement du placement (et de la taille) des composants, donc ça s'oppose au fait qu'on puisse déplacer les composants. Sans Layout Manager, il faudra placer et dimensionner tous les composants soi-même, en appelant les méthodes setLocation() et setSize().

    Ensuite, pour réagir à la souris on utilise un MouseListener (voir documentation Oracle ou FAQ Developpez). Pour détecter le déplacement de la souris pendant que le bouton est enfoncé, on utilisera un MouseMotionListener. On peut utiliser un MouseAdapter qui est une classe qui combine les 2 comportements.

    Le principe est le suivant :
    • lorsque le bouton gauche est enfoncé, on enregistre le fait qu'on déplace un bouton
    • lorsqu'on déplace la souris et que le bouton est enfoncé (drag en anglait/Java), on modifie les coordonnées des composants en fonction du déplacement
    • lorsque le bouton est relaché, on désenregistre le fait qu'on déplace un composant


    A noter que lorsqu'un composant reçoit un évenement souris, la position de la souris est relative au composant : il est donc nécessaire de mémoriser cette position relative pour que lorsqu'on déplace le composant, on prenne bien en compte ce décalage.

    Voici un exemple de principe :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.JComboBox;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
     
    public class Test extends JFrame {
    	private String[] genre = { " Masculin ", " Feminin " };
     
    	public Test() {
    		this.setTitle("Deplacement");
    		this.setSize(500, 300);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    		this.getContentPane().setLayout(null); // on n'utilise pas de Layout Manager
     
    		// on créé 2 tableaux pour stocker les composants, parce qu'on a besoin de leurs références pour les déplacer
    		JLabel[] labels = new JLabel[3];
    		JComponent[] fields = new JComponent[3];
     
    		labels[0] = new JLabel("Nom:");
    		fields[0] = new JTextField(10);
     
    		labels[1] = new JLabel("Prénom:");
    		fields[1] = new JTextField(10);
     
    		labels[2] = new JLabel("Sexe:");
    		fields[2] = new JComboBox<String>(genre);
     
    		// le fait qu'on ait des tableaux permet de gérer les composants en boucle
    		for(int i=0; i<3; i++) {
    			add(labels[i]);
    			add(fields[i]);
    			// on place et dimensionne les composants parce qu'il n'y a pas de Layout Manager qui le fait
    			labels[i].setSize(labels[i].getPreferredSize());
    			fields[i].setSize(fields[i].getPreferredSize());
    			if (i>0){
    				labels[i].setLocation(fields[i-1].getX()+fields[i-1].getWidth(), 0);
    			}
    			fields[i].setLocation(labels[i].getX()+labels[i].getWidth(), 0);
     
    			// on créé le MouseAdapter
    			MouseAdapter mouseAdapter = new MoveMouseAdapter(labels[i], fields[i]);
     
    			labels[i].addMouseListener(mouseAdapter); // on enregistre le MouseAdapter comme MouseListener sur le label (pour détecter l'enfoncement et le relachement du bouton
    			labels[i].addMouseMotionListener(mouseAdapter); // on enregistre le MouseAdapter comme MouseMotionListener sur le label (pour détecter le mouvement de la souris)
    		}
     
    		this.setVisible(true);
    	}
     
    	public static void main(String[] main) {
    		 new Test();
    	}
     
    	private static class MoveMouseAdapter extends MouseAdapter {
    		private boolean moved;
    		private int dx;
    		private int dy;
    		private JLabel label;
    		private JComponent field;
     
    		public MoveMouseAdapter(JLabel label, JComponent field) {
    			this.label=label;
    			this.field=field;
    		}
     
    		@Override
    		public void mousePressed(MouseEvent e) {
    			if ( e.getButton()==MouseEvent.BUTTON1 ) { // sur le bouton gauche
    				startMove(e);
    			}
    		}
     
    		private void startMove(MouseEvent e) {
    			moved=true; 
    			// on mémorise la position relative de la souris par rapport au composant
    			dx=e.getX(); 
    			dy=e.getY();
     
    		}
     
    		@Override
    		public void mouseDragged(MouseEvent e) {
    			if (moved) {
    				doMove(e);
    			}
    		}
     
    		private void doMove(MouseEvent e) {
    			// on déplace
    			// la nouvelle position est l'ancienne plus la différence entre la position actuelle de la souris et la position relative de la souris au démarrage du déplacement
    			label.setLocation(label.getX() + e.getX() - dx, label.getY() + e.getY() - dy);
    			field.setLocation(label.getX()+label.getWidth(), label.getY());
    		}
     
    		@Override
    		public void mouseReleased(MouseEvent e) {
    			if ( e.getButton()==MouseEvent.BUTTON1 && moved) {
    				stopMove();
    			}
    		}
     
    		private void stopMove() {
    			moved=false;
    		}
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Par défaut déplacement d'une label accompagné d'un JTextField
    Vous m'avez rendu un grand service.Je ne peux que vous remercier.Merci donc!!!
    Mais un probléme surgit .Le premier est que je veux éviter de superposer plusieurs composants à la fois.La façon dont je veux le résoudre est que lorsqu'on déplace un composant en enfonçant le bouton guauche de la souris et si des possiblités de superposition se présentent que le composant déplacé retourne à sa positon initial en relachant le bouton guauche de la souris.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Pour faire retourner le composant à sa position initiale, il suffit de la mémoriser dans une variable au moment où le bouton est enfoncé (dans startMove()). Ensuite, pendant le déplacement, tu peux détecter si le composant déplacé est en intersection avec l'un des deux autres, (de base, une simple comparaison de coordonnées et de tailles (un if), mais il existe aussi des méthodes dans la classe java.awt.Rectangle qui permet de tester une intersection plus facilement).

    Par contre, je ne suis pas sur de comprendre le fonctionnement : tu voudrais que si, pendant le déplacement d'un composant (label+field), il se superpose à un autre, alors, lorsqu'on relève le bouton de la souris, alors le composant revient à sa position initiale c'est ça ? Dans ce cas, il suffit d'un flag booléen : on le met à true dès qu'il y a intersection détectée, et dans le stopMove, on teste ce booléen pour savoir si on doit remettre les composants en position initiale (celle qu'on a mémoriser dans startMove()). Et pendant qu'on le déplace, et qu'il se superpose, on peut continuer à le déplacer, ou alors il bloque au bord (dans ce cas, il suffit de ne pas faire doMove() si l'intersection est vérifiée).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 5
    Par défaut déplacement d'une label accompagné d'un JTextField
    Bonsoir
    Je crois bien que c'est l'idée<< tu voudrais que si, pendant le déplacement d'un composant (label+field), il se superpose à un autre, alors, lorsqu'on relève le bouton de la souris, alors le composant revient à sa position initiale c'est ça ?>> Oui c'est ça . Je veux utiliser les rectangles pour détecter les intersections.Mais je n'ai pas trop de connaissances sur les rectangles.Grace au rectangles je peux les pivoter aussi . Si on travaillez au niveau des rectangle ça sera mieux.Si vous avez des tutos intéréssants à me proposer ils sont les biens venus.Pour l'instant travaillons surr le probléme de superposition des classes en utilisant les rectangles.Voici une classe qui regroupe plusieurs choses sur les rectangles au niveau de ce site (en Anglais) http://developer.classpath.org/doc/j...source.html.Vu la traduction il y'a beaucoups de chose intéréssant mais je ne comprends pas au niveau du code.Merci beaucoups pour le soutien et les clarificationss apportées.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    La classe Rectangle représente un rectangle horizontal/vertical, mais ne pourra pas représenter un rectangle "pivoté" (Mais il est possible de le transformer par rotation en une forme (java.awt.Shape) qui représente un rectangle "pivoté", mais je n'en vois pas trop pourquoi tu voudrais le faire dans le cadre de ce que tu cherches à faire).

    Tu trouveras la documentation officielle Oracle sur cette classe ici (pour Java 8).

    Ensuite, un composant SWING est de forme rectangulaire à la base : même si son dessin est d'une autre forme (un bouton rond par exemple), il s'agira d'un dessin à l'intérieur d'un rectangle. La méthode getBounds() permet de récupérer ce rectangle, qui correspond en fait à la surface occupée par le rectangle, en position relative à son parent — le composant dans lequel il se trouve). Les 2 composants label et field étant juxtaposés, on peut connaitre le rectangle correspondant aux deux en faisant l'union des bounds de chacun, comme ça (si label est la variable pour le label et field celle pour le champ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static Rectangle getBounds(JLabel label, JComponent field) {
        return label.getBounds().union(field.getBounds());
    }
    Ensuite la méthode intersects de Rectangle te permettra de tester si 2 rectangles sont en intersection.

    Dans mon exemple, j'ai utilisé 2 tableaux pour stocker les labels et fields. Tu peux facilement faire une boucle pour créer un nouveau tableau de Rectangle qui contient les bounds des couples de composants (dans startMove, pour avoir les bounds au moment de début de déplacement, en ignorant bien sûr l'index du couple traité par le MoveMouseAdapter) : pour ça il te faudra passer les tableaux au constructeur de MoveMouseAdapter, et l'index du couple traité, pour les stocker en variable membre de cette classe.

    Ensuite, pour tester, il suffira de parcourir ce tableau de Rectangle, et si le rectangle du couple label/field déplacé est en intersection avec l'un des rectangles du tableau, alors il se superpose à un autre couple de composants...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. JTextField : interdire le déplacement du curseur ?
    Par wam111 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 17/04/2014, 16h24
  2. Label "internet accompagné"
    Par tabouet dans le forum Droit du travail
    Réponses: 1
    Dernier message: 25/01/2012, 00h41
  3. déplacement d'un label très saccadé
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 20
    Dernier message: 13/01/2008, 00h02
  4. [VB6] Des labels qui réagissent à la souris
    Par murielle dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 24/10/2002, 14h19
  5. scroll dans un label
    Par Pretender dans le forum Composants VCL
    Réponses: 9
    Dernier message: 27/09/2002, 17h06

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