Comment je dessine mon cercle ?

Signaler
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005
-
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
-
Bonjour,

J'ai pris des trucs à droite à gauche, mais j'arrives pas à dessiner un cercle.

J'aimerai qu'il se dessine en appuyant sur le bouton "cerle", mais avant ca rien que le faire apparaitre serai très bien.

Merci pour l'aide...

**********************************************************

import java.awt.*;

import java.awt.event.*;



public class Totoshop extends Frame {

// définition des composants

MenuBar menuBarre;

MenuItem menuNouveau, menuQuitter;

Panel outilBarre;

Menu menuFichier;

Canvas graphe;



//Pour la couleur des dessins

private static Color[] colors = {Color.red,Color.green,Color.gray,Color.orange,Color.yellow,




Color.magenta,Color.pink,Color.cyan,Color.black};

public Totoshop() {

setTitle("Totoshop");

setBackground(Color.white);

graphe = new Canvas();



// construction de l'objet barre d'outils

outilBarre = new Panel();

outilBarre.setBackground(Color.orange);



// construction de l'objet barre d'outils

Button[] boutons = {new Button("Cercle"),new Button("Carré"), new Button("Effacer")};

for (int i=0 ; i< boutons.length; i++)

outilBarre.add(boutons[i]);



// construction de l'objet barre de menu avec sa propre fonte

menuBarre =new MenuBar();

menuBarre.setFont(new Font("Helvetica", Font.BOLD, 14));



// construction des objets menus puis des items (commandes de menus)

menuFichier = new Menu("Fichier");



menuNouveau = new MenuItem("Nouveau");

menuQuitter = new MenuItem("Quitter");



// on place les items dans les menus

menuFichier.add(menuNouveau);

menuFichier.addSeparator();

menuFichier.add(menuQuitter);



// on place les menus dans la barre de menu avec un gridLayout par défaut

menuBarre.add(menuFichier);



// on place les barres de menu, d'outils, d'état et la surface de dessin

setMenuBar(menuBarre);

add(outilBarre,"North");

add(graphe,"Center");



//Actions à effectuer lors de la fermeture du programme

menuQuitter.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e)

{

System.exit(0);

}

});

//Actions à effectuer lors de l'effacement du dessin

menuNouveau.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e)

{

repaint();

}

});

boutons[2].addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e)

{

repaint();

}

});

}

// fin constructeur



public static void main (String arg[]) {

Totoshop f = new Totoshop();

f.setBounds(20, 10, 800, 600);

f.setVisible(true);

}

//Définition d'un cercle

public void Cercle (Graphics g)

{

g.drawOval(10,10, 50, 50) ;

for (int i = 0; i <= 8; i++)

{ g.setColor(colors[i % colors.length]);

}

repaint();

}



}

16 réponses

Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
J'ai pas vu l'endroit ou tu appelais la methode Cercle (Graphics g) ... amois d'avoir mal regardé... essaye en remplant "Cercle" par "paint" (surcharge de methode paint donc...)

et pour ton canvas, j'ai juste vu une déclaration et tu l'ajoute dans son conteneur, mais tu ne l'utilise pas par la suite...
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
tient essaye ce code là, tu le réarrange en fonction de tes besoins...

j'ai fait 2 sous classes comme un gros goret pour aller plus vite, si tu ne comprend pas demande :)



import javax.swing.*;

import java.awt.event.*;

import java.util.*;

import java.awt.*;



public class APIGraphe extends JFrame implements MouseListener{



public static void main(String[] args){

APIGraphe pouet = new APIGraphe() ;

}



Graphe graf = new Graphe();



public APIGraphe() {

this.setSize(400 , 300);

graf.addMouseListener(this);

this.getContentPane().add(graf , BorderLayout.CENTER);

this.setVisible(true);

}



public void mouseClicked(MouseEvent e) {

graf.ajouterCercle(e.getX() , e.getY());

}

public void mousePressed(MouseEvent e) {}

public void mouseReleased(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}



//la on etend un canvas dans lequel on va dessiner les formes

//mais ca peut etre un panel ou n'importe quel composant graphique.

class Graphe extends Canvas{

ArrayList cercles = new ArrayList() ;

public Graphe(){}

public void ajouterCercle(int x , int y){

cercles.add(new Cercle(x-10,y-10,20,20));

repaint();

}

public void paint(Graphics g){

g.setColor(Color.WHITE);

for(int i = 0 ; i < cercles.size() ; i++)

{//on peint tous les cercles

Cercle c = (Cercle) cercles.get(i) ;

g.drawOval(c.getX(),c.getY(),c.getWidth(),c.getHeight());

}

}

}//fin de class Graphe



//petite class vite fait pour un cercle

class Cercle{

int x , y , w , h ;

public Cercle(int x , int y , int width , int height){

this.x = x ;

this.y = y ;

this.w = width ;

this.h = height ;

}

public int getX(){return x;}

public int getY(){return y;}

public int getWidth(){return w;}

public int getHeight(){return h;}

}//fin de classe Cercle



}//fin de class APIGraphe
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005

En fait, je n'apelle pas Cercle (Graphics g) car je ne sais pas comment le faire, ni ou le mettre (enfin si dès l'appuis sur le bouton cercle, mais comment ?).


Pour mon canvas, je ne l'utilise pas ? Je crois que j'ai rien compris au java... Pourtant, il est bien là, enfin je crois, on l'utilise comment alors.


Mes questions peuvent parraitre bête, mais il me faut un projet pour le mois prochain, et la programation, c'est pas mon truc.
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
Dans un premier temps, essaye le bout de code que j'ai posté, fait des sorties consoles

System.out.println("pouet");

un peu partout pour comprendre comment ca tourne et ensuite tu pourras
modifier ce dont tu as besoin, rajouter des fonctionnalites, des
formes, etc...

Pour le canvas, tu peux l'utiliser mais aussi utiliser un autre
composant (comme un JPanel par exemple), il faut simplement que tu
redéfinisse la methode "paint(Graphics g)".



Tiens tu peux aller voir Comment dessiner en java.
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005

J'ai essayé la ligne : System.out.println("pouet"); ca me donne une petite idée du style action/réaction. je vais approfondir avec ca.
Par contre, j'ai pas compris la fonction repaint(), il me semblai que ca coloriait l'intérieur d'une forme. or dans ton programme, les cercles ne sont pas coloriés, pourquoi ?
De plus, est ce bien la ligne : public void mouseExited(MouseEvent e) {} qui permet de fermer le programme à l'aide de la croix windows ? je l'ai incorporé dans mon programme, et rien. Par contre si je l'enlève du tiens, ca compile plus. elle est dépendante des lignes ecrite un peu plus haut ?
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
Alors,

- repaint() sert a rappeler automatiquement la methode paint(Graphics g)

- si tu veux un cercle plein, utilise fillOval() plutot que drawOval() (remplir / dessiner)

- pour mouseExited, c'est une methode qui fait partie de
l'interface MouseListener... Si une classe implemente une interface,
elle est obligée de redefinir toutes ses methodes. En gros, un
evenement mouseExited sera lancé a chaque fois que ton curseur sortira
de ton canvas (le composant qu iimplemente MouseListener)

- Pour quitter le programme avec la croix, tu peux soit

- ajouter la ligne this.setDefaultCloseOperation(EXIT_ON_CLOSE) dans le constructeur de ta JFrame (APIGraphe)

- ou alors ajouter un WindowListener a ta JFrame,
implementer ses methodes et faire le necessaire dans les methodes
windowClosing() et windowClosed()



vala vala
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005

Voilà, j'ai fais quelques modifs, mais 3 trucs me chiffonnent :
- Je n'arrive pas à changer la taille de la fenetre, c'est bien cette ligne - this.setSize(400 , 300); ?
- Je n'arrive pas à changer la taille des cercles et carrés c'est bien cette ligne - cercles.add(new Cercle(x-10,y-10,20,20));
- Pourquoi mes dessins sont toujours noir et ne change pas de couleur à chaque nouvelle figure ?

Merci.
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005

import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;


public class APIGraphe extends JFrame implements MouseListener{


private static Color[] colors = {Color.red,Color.green,Color.gray,Color.orange,Color.yellow,
Color.magenta,Color.pink,Color.white,Color.cyan,Color.black};


public static void main(String[] args){
APIGraphe pouet = new APIGraphe() ;
}


Graphe graf = new Graphe();


public APIGraphe() {
this.setSize(400 , 300);
graf.addMouseListener(this);
this.getContentPane().add(graf , BorderLayout.CENTER);
this.setVisible(true);
}


public void mouseClicked(MouseEvent e) {
Random r=new Random();
int fig = r.nextInt(2)+1;
if (fig == 1) graf.ajouterCercle(e.getX() , e.getY());
else graf.ajouterCarre(e.getX() , e.getY());
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}


//la on etend un canvas dans lequel on va dessiner les formes
//mais ca peut etre un panel ou n'importe quel composant graphique.
class Graphe extends Canvas{
ArrayList cercles = new ArrayList() ;
ArrayList carres = new ArrayList() ;
public Graphe(){}
public void ajouterCercle(int x , int y){
cercles.add(new Cercle(x-10,y-10,20,20));
repaint();
}
public void ajouterCarre(int x , int y){
carres.add(new Carre(x-10,y-10,20,20));
repaint();
}
public void paint(Graphics g){
setBackground(Color.blue);
for (int v = 0; v <= 9; v++)
{
g.setColor(colors[v % colors.length]);
}
for(int i = 0 ; i < cercles.size() ; i++)
{//on peint tous les cercles
Cercle c = (Cercle) cercles.get(i) ;
g.fillOval(c.getX(),c.getY(),c.getWidth(),c.getHeight());
}
for(int i = 0 ; i < carres.size() ; i++)
{//on peint tous les carres
Carre c = (Carre) carres.get(i) ;
g.fillRect(c.getX(),c.getY(),c.getWidth(),c.getHeight());
}


}

}//fin de class Graphe

//petite class vite fait pour un cercle
class Cercle{
int x , y , w , h ;
public Cercle(int x , int y , int width , int height){
this.x = x ;
this.y = y ;
this.w = width ;
this.h = height ;
}
public int getX(){return x;}
public int getY(){return y;}
public int getWidth(){return w;}
public int getHeight(){return h;}
}//fin de classe Cercle


//petite class vite fait pour un carre
class Carre{
int x , y , w , h ;
public Carre(int x , int y , int width , int height){
this.x = x ;
this.y = y ;
this.w = width ;
this.h = height ;
}
public int getX(){return x;}
public int getY(){return y;}
public int getWidth(){return w;}
public int getHeight(){return h;}
}//fin de classe Carre


}//fin de class APIGraphe
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
Pour les tailles, tu dois avoir un tout petit bug... poste les modifs que tu as fait



pour les couleurs :

public void paint(Graphics g){

g.setColor(Color.WHITE);

for(int i = 0 ; i < cercles.size() ; i++)

{//on peint tous les cercles

Cercle c = (Cercle) cercles.get(i) ;

g.drawOval(c.getX(),c.getY(),c.getWidth(),c.getHeight());

}

}



avant la boucle, on fixe la couleur a blanc (tu as du mettre noir sans doute) donc tous les cercles seront noir !

ce que tu peux fait, c'est attribuer une couleur pour chaque cercle et dans la boucle tu fais un

g.setColor( cercle.getCouleur() );

avant le g.drawOval(c.getX(),c.getY(),c.getWidth(),c.getHeight());
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
arf j'avais po vu le 2eme post :)



bon je viens de reprendre ton code il marche bien chez moij'ai fait un setSize(800 , 600), pas de probleme

j'ai modifie les taille de carre et de cercle, pas de probleme,

pour les couleurs je fais un ptit exemple :



class Cercle{

int x , y , w , h ;

Color col ;

public Cercle(int x , int y , int width , int height , Color col){

this.x = x ;

this.col = col ;

this.y = y ;

this.w = width ;

this.h = height ;

}

public int getX(){return x;}

public int getY(){return y;}

public int getWidth(){return w;}

public int getHeight(){return h;}

public Color getColor(){return this.col ;}

}//fin de classe Cercle



et dans le paint :

for(int i = 0 ; i < cercles.size() ; i++)

{//on peint tous les cercles

Cercle c = (Cercle) cercles.get(i) ;

g.setColor( c.getColor() ) ;

g.drawOval(c.getX(),c.getY(),c.getWidth(),c.getHeight());

}
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005

Comprends pas ce qui m'est arrivé avec les problèmes de taille de fenetre et de figures, maintenant ca marche.
J'ai essayé ce que tu viens de m'écrire, mais ca créé une erreur ligne 42 :
cercles.add(new Cercle(x-25,y-25,50,50));
Il doit manquer une variable (la couleur surrement), j'ai donc essayer de mettre ca :
cercles.add(new Cercle(x-25,y-25,50,50,col));
ca ne marche pas non plus.
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
oui, il faut bien évidemment rajouter la couleur quand on construit l'objet :

cercles.add(new Cercle(x-25,y-25,50,50, Color.BLUE )); (ou autre de ton choix)



car si je prend en compte ton code avec le cercle et le carre et la ligne :

cercles.add(new Cercle(x-25,y-25,50,50,col));

col est une variable inconnue a cet endroit du programme...
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005

En fait, quand j'ai tenté les lignes :
-private static Color[] colors = {Color.red,Color.green,Color.gray,Color.orange,
Color.yellow,Color.magenta,Color.pink,Color.white,Color.cyan,Color.black};

-for (int v = 0; v <= 9; v++)
{
g.setColor(colors[v % colors.length]);
}

(J'ai trouvé ca sur un autre prog, mais j'ai du oublier un truc...)

J'esperai comme ca faire changer les cercles de couleur de facon cyclique ou aleatoire sans passer par un truc lourd du style random i - if i==1 color=bleu; if i==2 color=...
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
Mais pourquoi donc faire de l'aleatoire ? c'est dans un but precis ?
Messages postés
11
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
10 juin 2005

non, le but est une couleur différente à chaque dessin.

J'ai aussi la possibilité d'une incrémentation du style i++ si i==1 couleur=bleu; i==2 ...

Mais encore une fois, c'est un peu barbare pour un truc qui pourrai ce faire en 2 lignes.
Messages postés
388
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
3 mai 2006
1
D'abord faut qu'ca marche, ensuite tu optimises...