problème pour créer interface Shape
Bonjour,
Je cherche à créer un classe complexe drawable. Pour cela, il me semble qu'il faut implémeter une interface Shape. Mais je n'y arrive pas. (précision : je travaille avec java1.5 par obligation - cela m'est imposé. D'après le tuto de sun, cela semble plus simple avec 1.6)
Voici mon code, si quelqu'un voit mon erreur ou mes oublis...
1ère classe : cercle implémenté Shape, l'objet que je voudrai pouvoir dessiner avec un draw
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package ObjetPrDessiner;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
public class Cercle implements Shape {
private double radius;
private Ellipse2D.Double circle;
private Point2D.Double centreCercle;
public Cercle(Point2D.Double control){
centreCercle = control;
radius = 50;
}
public void draw() {
circle = new Ellipse2D.Double(centreCercle.x - radius, centreCercle.y - radius, 2.0 * radius,
2.0 * radius);
}
} |
2e fichier : l'interface Shape
Code:
1 2 3
| public interface Shape {
public void draw();
} |
3e fichier : le panel où dessiner le cercle
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
| import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import javax.swing.JPanel;
public class DessinerCercle extends JPanel{
private Point2D.Double centreC;
private Cercle cercle1;
/** espace graphique pour le dessin */
private Graphics2D g2D;
/** epaisseur des traits */
private BasicStroke bs;
public DessinerCercle(Point2D.Double centre){
// création des variables
centreC = centre;
init();
}
// création du cercle
public void init(){
cercle1 = new Cercle(centreC);
bs = new BasicStroke(2,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_ROUND);
}
// dessin
public void paint(Graphics g){
g2D = (Graphics2D) g;
g2D.setColor (Color.red);
g2D.setStroke(bs);
g2D.drawLine((int)centreC.x -50,(int) centreC.y, (int)centreC.x +50, (int)centreC.y);
g2D.draw(cercle1);
}
} |
*** c'est "g2D.draw(cercle1);" qui n'est pas reconnu
Merci de votre aide
Pour faire des dessins complexes il fallait utiliser Area
débutant en java, j'étais partie sur une fausse piste pour résoudre mon problème. Ce sont les Area qui permettent de combiner des formes et de les déplacer facilement.
Exemple:
Code:
1 2
| area1 = new Area(new Ellipse2D.Double(100, 100, 150, 100));
area2 = new Area(new Rectangle2D.Double(150, 150, 150, 100)); |
on peut ensuite les transformer en les additionnant, ex :
ou les soustraire
Code:
area1.subtract(area2);
ou faire des translations.
Comme la couleur est définie au moment du paint, il faut autant d'Area que de couleurs.
Les Line2D.Double ne peuvent pas être des Area mais j'ai trouvé une façon de contourner cette limite en prenant une CubicCurve dont les directions sont très proches des points de début et de fin :
Code:
1 2
| droite = new CubicCurve2D.Double(x1n,y1n,x1n+1,y1n+1,x2n,y2n,x2n+1,y2n+1);
area3 = new Area(droite); |
(sans les +1 cela ne peut pas être une Area)