A ta place, je ferais :
Un composant graphique qui dérive de JComponent. Il redéfinie la méthode paint. Tu l'attache dans ta JFrame.
Un composant controleur : Il gère ta souris (implémente MouseListener, MouseMotionListener par exemple). Tu peut stocker quelques informations dans ce composant, ou les éclater dans une troisième classe "Modèle".
L'idée, c'est que le controleur connait le composant graphique et vis et versa. Quand ton controleur détecte un changement qui nécéssite un rafraichissement, il invoque la méthode repaint du composant graphique, et c'est tout.
La méthode paint prend ses informations sur le modèle, et le dessine.
Voici un exemple à ajouter en JFrame. Quand tu clique une fois, ca mémorise la position. Une deuxième fois et ca trace un trait entre les 2.
Composant graphique :
package test;
import java.awt.Graphics;
import javax.swing.JComponent;
public class GComp extends JComponent {
MouseControler ctr=null;
public GComp ()
{
ctr=new MouseControler(this);
this.addMouseMotionListener(ctr);
this.addMouseListener(ctr);
}
public void paint(Graphics g) {
if (ctr.isLineValid())
g.drawLine(ctr.getStart().x,ctr.getStart().y,ctr.getStop().x,ctr.getStop().y);
}
}
Contrôleur / Modèle
package test;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class MouseControler implements MouseListener, MouseMotionListener {
private Point mousePos=new Point(0,0);
private Point start=null;
private Point stop=null;
private int state=0;
private GComp c;
public MouseControler (GComp c)
{
this.c=c;
}
public void mouseMoved(MouseEvent e) {
mousePos=e.getPoint();
c.repaint();
}
public Point getMousePos() {
return mousePos;
}
public boolean isLineValid()
{
if (state==2)
return true;
return false;
}
public void mouseClicked(MouseEvent e) {
switch (state) {
case 0:
state=1;
start=e.getPoint();
break;
case 1:
state=2;
stop=e.getPoint();
c.repaint();
break;
default:
break;
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
public Point getStart() {
return start;
}
public Point getStop() {
return stop;
}
}
# Suggestion
Posté par taldius . En réponse au message relier deux points. Évalué à 1.
package test; import java.awt.Graphics; import javax.swing.JComponent; public class GComp extends JComponent { MouseControler ctr=null; public GComp () { ctr=new MouseControler(this); this.addMouseMotionListener(ctr); this.addMouseListener(ctr); } public void paint(Graphics g) { if (ctr.isLineValid()) g.drawLine(ctr.getStart().x,ctr.getStart().y,ctr.getStop().x,ctr.getStop().y); } }Contrôleur / Modèlepackage test; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; public class MouseControler implements MouseListener, MouseMotionListener { private Point mousePos=new Point(0,0); private Point start=null; private Point stop=null; private int state=0; private GComp c; public MouseControler (GComp c) { this.c=c; } public void mouseMoved(MouseEvent e) { mousePos=e.getPoint(); c.repaint(); } public Point getMousePos() { return mousePos; } public boolean isLineValid() { if (state==2) return true; return false; } public void mouseClicked(MouseEvent e) { switch (state) { case 0: state=1; start=e.getPoint(); break; case 1: state=2; stop=e.getPoint(); c.repaint(); break; default: break; } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseDragged(MouseEvent e) { } public Point getStart() { return start; } public Point getStop() { return stop; } }