Salut,

Je me suis mis a Swing depuis hier . J'essai de faire un tableau blanc et j'ai un probleme curieux : Lorsque je dessine un point par exemple, ou une ligne, le tracé apparait une quinzaine de pixels au dessus du curseur de la souris ! Je n'arrive pas trouver d'ou cela vient ..

Et tant que j'y suis j'ai des doutes quant à la conception. Bon je me suis documenté sur les listeners que j'apprend également à utiliser et voila mon souci :

J'ai d'une part des boutons 'crayon', 'rectangle' etc qui sont JToggleButton et d'autre part un MouseListener et MouseMotionListener sur un JPanel, sur lequel on pourra dessiner. J'ai commencé a coder de la maniere suivante : Dans le cas ou je veux dessiner une ligne, dans la fonction mouseDragged je teste si le bouton "Ligne" est enfoncé, si c'est le cas j'appelle la fonction drawLine(). Ca marche mais j'imagine que c'est pas tres optimal.

Pouvez-vous me conseiller une méthode ? Je laisse mon code, ca sera plus simple à comprendre (ou pas )

merci !

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package whiteboard;
 
import  javax.swing.*;
import  java.awt.*;
import  java.awt.event.*;
 
public class whiteboard extends JFrame {
    private JToggleButton buttonPen, buttonLine, buttonRectangle, buttonCircle, buttonText;  //les boutons
    protected ButtonGroup group;
    protected int lastX=0, lastY=0;
 
    /** Constructeur de test */
    public whiteboard() {
        //titre de la fenetre
        super("SIP Whiteboard");
        this.setSize(new Dimension(640,480));
        this.setResizable(false);
 
        // Container
        Container content = getContentPane();
        content.setBackground(Color.lightGray);
 
        // Panels
        JPanel controlArea = new JPanel(new GridLayout(8,2,0,8));
        JPanel drawArea = new JPanel();
 
        controlArea.setPreferredSize(new Dimension(100,200));
        drawArea.setBackground(Color.WHITE);
        drawArea.setPreferredSize(new Dimension(540,0));
 
        drawArea.addMouseListener(new PositionRecorder());
        drawArea.addMouseMotionListener(new Drawer());
 
        content.add(controlArea,BorderLayout.EAST);
        content.add(drawArea,BorderLayout.WEST);
 
        // Boutons
        buttonPen = new JToggleButton("Stylo",true);       
        buttonLine = new JToggleButton("Ligne");        
        buttonRectangle = new JToggleButton("Rectangle");    
        buttonCircle = new JToggleButton("Cercle");
        buttonText = new JToggleButton("Texte");
 
 
        buttonPen.addActionListener(new TraitementbuttonPen());
        buttonLine.addActionListener(new TraitementbuttonLine());
        buttonRectangle.addActionListener(new TraitementbuttonLine());
        buttonCircle.addActionListener(new TraitementbuttonLine());
        buttonText.addActionListener(new TraitementbuttonLine());
 
        // Groupes les boutons
        group = new ButtonGroup();
        group.add(buttonPen);
        group.add(buttonLine);
        group.add(buttonRectangle);
        group.add(buttonCircle);
        group.add(buttonText);
 
        // Les ajouter au JPanel
        controlArea.add(buttonPen);
        controlArea.add(buttonLine);
        controlArea.add(buttonRectangle);
        controlArea.add(buttonCircle);
        controlArea.add(buttonText);
 
        //
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        //pack(); //permet de mettre une bonne dimension a la fenetre
        setVisible(true);
    }
 
    public static void main(String args[]) {
        new whiteboard();
    }
 
 
    public class TraitementbuttonPen implements ActionListener {
        public void actionPerformed(ActionEvent e){
            System.out.println("Ici !");            
        }
    }
 
     public class TraitementbuttonLine implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            System.out.println("2eme !");
        }
    }
 
    private class PositionRecorder extends MouseAdapter {
        public void mouseEntered(MouseEvent event) {
            requestFocus(); 
            record(event.getX(), event.getY());
            System.out.println(event.getX() + " " + event.getY());
        }
 
        public void mousePressed(MouseEvent event) {
            int x = event.getX();
            int y = event.getY();
            record(x, y);
        }
 
        public void mouseClicked(MouseEvent event) {
            int x = event.getX();
            int y = event.getY();
 
            if (buttonPen.isSelected() == true){
                Graphics g = getGraphics();
                g.drawLine(x, y, x, y);
            } 
            System.out.println(event.getX() + " " + event.getY());
        }
    }
 
     protected void record(int x, int y) {
            lastX = x;
            lastY = y;
     }
 
    private class Drawer extends MouseMotionAdapter {
        public void mouseDragged(MouseEvent event) {
            int x = event.getX();
            int y = event.getY();
            //System.out.println(x + " " + y);
            if (buttonPen.isSelected() == true){
                Graphics g = getGraphics();
                g.drawLine(lastX, lastY, x, y);
                record(x, y);
            } 
        }
    }
}
edit : oublié le code