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 !
Version imprimable
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 !
Mais.... la souris se déplace déjà sur les axes X et Y 8O
A mon avis,ça doit être un problème d'expression :aie:
Tu pourrais détailler plus ce que tu veux faire?
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 :)
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.
Peut-être comme cela, avec la touche espace pour activer/desactiver ? :
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.Code:
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(); } } }
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.
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 !
La classe est autonome, fais l'essai ;)Citation:
Caalador, qu'entend tu par ça décale tout?
- 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)
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 ! :ccool:
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.
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).
En effet, c'est une solution qui me semble pas mal du tout, et pas plus compliqué.Citation:
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 gros un pointeur virtuel en JAVA2D qui prend compte des coordonnées réelles de la souris.
Je propose donc cela suite aux commentaires de dinogoban.
Code:
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); } }
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.
Après l'astuce ce serait d'en faire un JPanel au lieu d'une JFrame et de le positionner en GlassPane.Code:
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); } }