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

 Java Discussion :

Bouger la souris seulement sur 2 axes?


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut Bouger la souris seulement sur 2 axes?
    Bonjour !

    J'aimerais savoir s'il était possible de faire en sorte que, après un clic, la souris ou plutôt le curseur de la souris ne puisse bouger seulement que sur les axes X et Y ?


    Merci pour votre aide !

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Mais.... la souris se déplace déjà sur les axes X et Y
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    A mon avis,ça doit être un problème d'expression

    Tu pourrais détailler plus ce que tu veux faire?

  4. #4
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut
    Lol oui effectivemment ^^

    En fait, je veux que le pointeur de souris ne se déplace que verticalement ou horizontalement, et donc que je ne puisse faire aucune diagonale voilà je pense que c'est plus claire

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    C'est réellement le pointeur qui doit se déplacer comme ça, ou alors l'action effectuée par le pointeur ?
    Exemple : c'est un logiciel de dessin, et tu souhaites tracer un trait horizontal ou vertical ?
    Attention à l'ergonomie : il peut être déconcertant pour l'utilisateur de ne plus avoir le contrôle de la souris.
    Dans la plupart des cas, le pointeur reste libre mais ce qui est bougé par le pointeur suis des règles particulières.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Peut-être comme cela, avec la touche espace pour activer/desactiver ? :
    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
    import java.awt.AWTException;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Robot;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
     
    import javax.swing.*;
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements MouseMotionListener, KeyListener {
    	private int x_saved, y_saved, x, y, x_saved_comp, y_saved_comp;
    	private MouseEvent mouse = null;
    	private Robot robot = null;
     
    	public Test () {
    		setBackground(Color.GRAY);
     
    		try {
    			robot = new Robot();
    		} catch (AWTException e) {
    			e.printStackTrace();
    		}
     
    		addMouseMotionListener(this);
    		addKeyListener(this);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(350, 400);
    	}
     
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
    		g.setColor(Color.WHITE);
    		if(x_saved!=0){			
    			g.drawLine(0, y_saved_comp, getWidth(), y_saved_comp);
    			g.drawLine(x_saved_comp, 0, x_saved_comp, getHeight());
    		}
    	}
     
     
    	 public static void main(String[] args) {
    		new Test().setVisible(true);
    	}
     
     
    	public void mouseDragged(MouseEvent e) {}
     
     
    	public void mouseMoved(MouseEvent e) {
    		if(x_saved==0){
    			mouse = e;
    		}else{
    			x = e.getXOnScreen();
    			y = e.getYOnScreen();
     
    			if( (x_saved - x<0?-(x_saved - x):x_saved - x) > (y_saved - y<0?-(y_saved - y):y_saved - y) ){
    				robot.mouseMove(e.getXOnScreen(), y_saved);
    			}else{
    				robot.mouseMove(x_saved, e.getYOnScreen());
    			}
    		}
    	}
     
     
    	public void keyPressed(KeyEvent e) {}
     
     
    	public void keyReleased(KeyEvent e) {}
     
     
    	public void keyTyped(KeyEvent e) {
    		if(e.getKeyChar()==KeyEvent.VK_SPACE){
    			if(x_saved==0){				
    				x_saved = mouse.getXOnScreen();
    				y_saved = mouse.getYOnScreen();
    				x_saved_comp = mouse.getX();
    				y_saved_comp = mouse.getY();
    			}else{
    				x_saved = 0;
    				y_saved = 0;
    				x_saved_comp = 0;
    				y_saved_comp = 0;
    			}
    			repaint();
    		}
    	}
    }
    Par contre attention, je n'ai pas pris le temps de prendre en compte le fait que l'utilisateur déplace la fenêtre. Du coup ca décale tout.
    Mais en effet, comme cela est dit plus haut, si c'est pour obtenir quelque chose de similaire à la touche shift dans photoshop, le curseur n'est jamais verrouillé.
    C'est le tracé que l'on est en train de faire qui l'est.

  7. #7
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut
    ben je sais pas, soit seulement le pointeur, mais c'est vrai que ça peu embeter l'utilisateur, soit effectivement tracer un trait. Mais en fait mon projet est de faire des mesures entre 2 points en faisant un clic pour chaque points.

    Mais le truc c'est que l'écart doit obligatoirement être horizontal ou vertical, donc en faisant un trait j'ai peur que ça ne m'aide pas, le trait lui sera droit mais on pourra quand même cliquer en diagonale, or ce n'est pas ce que je recherche.

    Je pense que je vais faire en sorte que le pointeur lui même sera bloqué, a moins que vous ayez une autre solution en tête?

    Caalador, qu'entend tu par ça décale tout?

    Merci encore !

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Caalador, qu'entend tu par ça décale tout?
    La classe est autonome, fais l'essai
    - Place ta souris dans la fenêtre
    - appuies sur espace
    - normalement à ce stade, cela devrait ressembler à ce que tu recherches
    - puis bouges la fenêtre
    - et là... ca ne devrait plus aller du tout

    Par contre, c'est ajustable si c'est réellement la solution que tu recherches, mais je pense que ce n'est pas la bonne solution.

    Je reprend l'exemple de photoshop (car c'est l'exemple que je connais le mieux).
    Lorsque tu fais une mesure (droite ou de travers), le logiciel te donne la valeur réelle (de point à point) mais aussi la valeur verticale et horizontale.
    Donc rien ne t'empêche de faire une mesure entre 2 point, et de ne retrouver que la valeur horizontale ou que la valeur verticale, sans avoir à verrouiller la souris. (voir screenshot)
    Images attachées Images attachées  

  9. #9
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Janvier 2009
    Messages : 45
    Par défaut
    Oui je vois ce que tu veux dire, et je pense aussi que c'est la meilleure solution. Je vais m'en tenir à ceci, en ne prenant que la valeur de l'axe qui m'intéresse.

    En tout cas merci et à bientôt !

  10. #10
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    ARGH !! Non !!! Ne jamais utiliser la classe Robot dans un projet final !
    La classe Robot est à l'usage unique de test, et dans de très rare cas pour une application bien spécifique.

    Dans ton cas, une autre idée : au premier clic, un trait vertical est affiché. Puis au déplacement de la souris, si dx > dy, alors afficher un trait vertical sous la souris.
    Sinon, si dx < dy, alors redessiner le trait du début pour qu'il soit horizontal, et tracé un trait horizontal au niveau du pointeur de souris.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    ARGH !! Non !!! Ne jamais utiliser la classe Robot dans un projet final !
    Je comprend ce que tu veux dire mais je n'ai pas trouvé d'autres solutions pour déplacer la souris.
    Tu en connais une ?

  12. #12
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Caalador Voir le message
    Je comprend ce que tu veux dire mais je n'ai pas trouvé d'autres solutions pour déplacer la souris.
    Tu en connais une ?
    Il ne faut pas bouger la souris. Rare sont les applications finales qui ont besoin de bouger la souris au niveau système. Si, dans un cas extrême, le besoin s'en fait sentir, alors la classe Robot est une solution possible.
    Sinon, dans le cas présent, il est tout à fait possible de cacher le pointeur dans la fenêtre de l'application et d'émuler tout les comportements possibles (ex: tracer des barres verticales/horizontales qui bougent en même temps que la souris).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Sinon, dans le cas présent, il est tout à fait possible de cacher le pointeur dans la fenêtre de l'application et d'émuler tout les comportements possibles (ex: tracer des barres verticales/horizontales qui bougent en même temps que la souris).
    En effet, c'est une solution qui me semble pas mal du tout, et pas plus compliqué.
    En gros un pointeur virtuel en JAVA2D qui prend compte des coordonnées réelles de la souris.

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Je propose donc cela suite aux commentaires de dinogoban.

    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
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
     
    import javax.swing.*;
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements MouseMotionListener, MouseListener {
    	private int x, y, x_start_point, y_start_point;
    	private NumberFormat nf = new DecimalFormat("#.00");
    	private final static Font LEGENDE = new Font("Sans Serif, Helvetica, Arial", Font.ROMAN_BASELINE, 10);
     
    	public Test () {
    		setBackground(Color.GRAY);
     
    		x_start_point=-1;
    		y_start_point=-1;
     
    		addMouseMotionListener(this);
    		addMouseListener(this);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(350, 400);
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
    		if(x_start_point!=-1){
    			g.setColor(Color.RED);
    			g.drawLine(x_start_point, y_start_point, x, y);
    			g.setColor(new Color(255,255,255,50));
    			g.fillRect(x+10, y, 72, 47);
    			g.setColor(Color.BLACK);
    			g.setFont(LEGENDE);
    			g.drawString("d : " + nf.format((Math.sqrt(Math.pow((x - x_start_point),2)+Math.pow((y - y_start_point),2)))), x+15, y+15);
    			g.drawString("h : " + (x - x_start_point), x+15, y+27);
    			g.drawString("v : " + (y - y_start_point), x+15, y+39);
    		}
    	}
     
    	// Listeners
    	public void mouseDragged(MouseEvent e) {
    		x = e.getX();
    		y = e.getY();
    		repaint();		
    	}
     
    	public void mouseMoved(MouseEvent e) {}
     
    	public void mouseClicked(MouseEvent e) {}
     
    	public void mouseEntered(MouseEvent e) {}
     
    	public void mouseExited(MouseEvent e) {}
     
    	public void mousePressed(MouseEvent e) {
    		x_start_point=e.getX();
    		y_start_point=e.getY();
    	}
     
    	public void mouseReleased(MouseEvent e) {
    		x_start_point=-1;
    		y_start_point=-1;
    	}
     
    	// Main
    	 public static void main(String[] args) {
    		new Test().setVisible(true);
    	}
    }

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Bon... je sais qu'on ne m'a rien demandé... mais vu que j'y ai travaillé dessus, voilà une version un peu améliorée.

    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
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
     
    import javax.swing.*;
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements MouseMotionListener, MouseListener {
    	private int x, y, x_start_point, y_start_point;
    	private NumberFormat nf = new DecimalFormat("#.00");
    	private final static Font LEGENDE = new Font("Sans Serif, Helvetica, Arial", Font.ROMAN_BASELINE, 10);
     
    	public Test () {
    		setBackground(Color.LIGHT_GRAY);
     
    		x_start_point=-1;
    		y_start_point=-1;
     
    		addMouseMotionListener(this);
    		addMouseListener(this);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setSize(350, 400);
    	}
     
    	@Override
    	public void paint(Graphics g) {
    		super.paint(g);
     
    		Graphics2D g2d = (Graphics2D)g;
    		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     
    		if(x_start_point!=-1){
    			// ligne
    			g2d.setColor(Color.RED);
    			g2d.drawLine(x_start_point, y_start_point, x, y);
     
    			// croix
    			g2d.setColor(Color.BLACK);
    			g2d.drawLine(x_start_point, y_start_point-3, x_start_point, y_start_point+3);
    			g2d.drawLine(x_start_point-3, y_start_point, x_start_point+3, y_start_point);
    			g2d.drawLine(x, y-3, x, y+3);
    			g2d.drawLine(x-3, y, x+3, y);
     
    			// legendes
    			g2d.setColor(new Color(255,255,255,80));
    			g2d.fillRect(x_start_point-60, y_start_point, 50, 35);
    			g2d.fillRect(x+10, y, 72, 95);
     
    			g2d.setColor(Color.BLACK);
    			g2d.setFont(LEGENDE);
     
    			g2d.drawString("x : " + (x_start_point), x_start_point-55, y_start_point+15);
    			g2d.drawString("y : " + (y_start_point), x_start_point-55, y_start_point+27);
     
    			g2d.drawString("x : " + (x), x+15, y+15);
    			g2d.drawString("y : " + (y), x+15, y+27);
     
    			g2d.drawString("h : " + (x - x_start_point), x+15, y+45);
    			g2d.drawString("v : " + (y - y_start_point), x+15, y+57);
     
    			g2d.drawString("° : " + nf.format(-(Math.toDegrees(Math.atan2(y-y_start_point , x-x_start_point)))), x+15, y+75);			
    			g2d.drawString("d : " + nf.format((Math.sqrt(Math.pow((x - x_start_point),2)+Math.pow((y - y_start_point),2)))), x+15, y+87);
    		}
    	}
     
    	// Listeners
    	public void mouseDragged(MouseEvent e) {
    		x = e.getX();
    		y = e.getY();
    		repaint();		
    	}
     
    	public void mouseMoved(MouseEvent e) {}
     
    	public void mouseClicked(MouseEvent e) {}
     
    	public void mouseEntered(MouseEvent e) {}
     
    	public void mouseExited(MouseEvent e) {}
     
    	public void mousePressed(MouseEvent e) {
    		x_start_point=e.getX();
    		y_start_point=e.getY();
    		x = e.getX();
    		y = e.getY();
    		repaint();		
    	}
     
    	public void mouseReleased(MouseEvent e) {}
     
    	// Main
    	 public static void main(String[] args) {
    		new Test().setVisible(true);
    	}
    }
    Après l'astuce ce serait d'en faire un JPanel au lieu d'une JFrame et de le positionner en GlassPane.

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

Discussions similaires

  1. Action selon un déplacement de la souris sur l'axe horizontal ou vertical
    Par ClarusAD dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2015, 14h57
  2. Bouger la souris sur une fenêtre en arrière plan
    Par youtpout978 dans le forum C#
    Réponses: 4
    Dernier message: 26/06/2011, 14h13
  3. Bouger objet sur SES axes (Java3D)
    Par kevinFr dans le forum 3D
    Réponses: 3
    Dernier message: 24/03/2011, 09h16
  4. Comment savoir si la souris est sur un TChart ?
    Par marsupilami34 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 01/10/2005, 00h16
  5. Réponses: 5
    Dernier message: 12/04/2005, 14h54

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