Pb #1 : Resolu -> Nouvelle QUESTION Pb #2

Pb #1 : Resolu -> Nouvelle QUESTION Pb #2 - Java - Programmation

Marsh Posté le 08-10-2002 à 22:13:17    

Voila j'ai un petit programme qui se décompose ainsi :
 
Je crée un premier panel p comme ceci :
 

Code :
  1. Panel p1 = new Panel();
  2. p1.setBackground(Color.white);
  3. p1.setLayout(new FlowLayout() );
  4. p1.add(parler); // parler est un bouton


 
Puis un second
 

Code :
  1. Panel p2 = new Panel();
  2. p2.setLayout(new FlowLayout() );


 

Code :
  1. Frame w = new Frame();
  2. w.add("North",p1);
  3. w.add("South",p2);


 
et je voudrais mettre dans le second du graphisme par exemple un cercle etc...
 
comment faire ??
 
en fait je voudrais faire une interface simple avec  
 
En HAUT = Bouton de commande
EN BAS = Forme qui change quand on clique sur les boutons
 
 
merci ;-)


Message édité par casquetta le 13-10-2002 à 16:26:57
Reply

Marsh Posté le 08-10-2002 à 22:13:17   

Reply

Marsh Posté le 08-10-2002 à 22:45:21    

et ben pour tout dire, tu es sur le bon chemin !
Pour dessiner il te faut un JPanel.
Comment dessiner dessus ?
Et ben il faut te faire un classe genre MonJpanel qui hérite de JPanel, et qui redéfinie la méthode paintComponent(Graphics g).
Après tu mets ce que tu veux dans cette méthode, et tu pourras bien sûr encapsuler dans cette classe les objets que tu dessineras par la suite, et les méthodes qui vont bien pour les manipuler ...
 
C'est pas très précis, mais bon tu trouveras facilement des exemples dans la literrature, voir http://penserenjava.free.fr et d'autres lien que tu trouveras dans la java FAQ de DarkLord (voir sa signature)


---------------
get amaroK plugin
Reply

Marsh Posté le 08-10-2002 à 22:57:42    

oula je crois que j'ai pas bien compris la
 
Je voit pas en fait comment faire pour qu'une suite de forme géometrique genre :
 
drawOval(50,50,300,300);
 
soit placé dans une endroit précis de la fenetre (ici un panel bien précis), c ca que je veut faire en fait

Reply

Marsh Posté le 08-10-2002 à 23:16:33    

voilà un exemple (pas testé, pas fait de java2D depuis 1 mois) :
 

Code :
  1. public class MonJPanel extends JPanel {
  2.     // le cercle affiché dans le panel ... initialisé à la volée
  3.     private Ellipse2D.Float cercle=new Ellipse2D.Float(200,200,40,40);
  4.     public MonJPanel() {
  5.       // on dimensionne le panel
  6.       this.setPreferredSize(new Dimension(400,400));
  7.     }
  8.     public void paintComponent(Graphics graphics) {
  9.        // on dessine le panel lui-même
  10.        super.paintComponent(graphics);
  11.        // on se met en Java2D (bien plus pratique qu'AWT)
  12.        Graphics2D g=(Graphics2D) g;
  13.        // on change la couleur de tracé
  14.        g.setPaint(Color.RED);
  15.        // dessine le cercle
  16.        g.fill(cercle);
  17.     }
  18.     public void moveCercle(float x,float y) {
  19.        // on bouge le cercle
  20.        cercle.setFrame(x,y,cercle.getWidth(),cercle.getHeight());
  21.        // on rafraichit le panel
  22.        repaint();
  23.     }
  24. }


 
Bon alors, c'est carément pas optimisé et tout et tout, et les types sont peut-être pas les mieux adaptés, mais c'est pour donner une idée (en espérant qu'elle ne soit pas fausse :sarcastic: )
 
Bon allez a+  [:bobuse]


Message édité par bobuse le 08-10-2002 à 23:17:24

---------------
get amaroK plugin
Reply

Marsh Posté le 08-10-2002 à 23:21:33    

casquetta a écrit a écrit :

oula je crois que j'ai pas bien compris la
 
Je voit pas en fait comment faire pour qu'une suite de forme géometrique genre :
 
drawOval(50,50,300,300);
 
soit placé dans une endroit précis de la fenetre (ici un panel bien précis), c ca que je veut faire en fait




ben en fait, jette un coup d'oeuil sur l'exemple que j'ai mis, j'espère que tu comprendras ...
 
drawOval(x,y,w,h), c'est une méthode de l'AWT ça ... utilise plutôt les nouvelles fonctionnalités de Java2D (SWING), c'est plus puissant et plus bo ;)  
sinon en utilisant cette fonction et ben, on peut imaginer que la class MonPanel contienne quatre champ : x, y, w, h qui sont mis à jour lorsque tu cliques sur un de tes boutons (sans oublier un chti repaint()), et donc l'appel drawOval(x,y,w,h) aura un effet dynamique. De toutes manières c'est jamais bon de mettre des valeurs en dur, encore moins dans un appel de fonction ...


---------------
get amaroK plugin
Reply

Marsh Posté le 08-10-2002 à 23:24:18    

mais le probleme c que on doit imperativement utilisé AWT et non pas JAVA2D
 
et quand je parle de PANEL c bien :  
 
Panel p = new Panel();
 
je veut pouvoir utilisé les objet dra<Oval, drawRectangle(à etc... et les placer ou je veut
 
cependant je sais pas comment faire pour les placer et ou les crée  dans la classe

Reply

Marsh Posté le 08-10-2002 à 23:31:37    

Mais je comprend pas meme dans ton exemple
 
ou est ce que le code va dire que l'objet graphique GRAPHICS va se placé a lendroit voulu en fait

Reply

Marsh Posté le 08-10-2002 à 23:41:02    

et ben c'est quasimodo la même chose en fait :

Code :
  1. public class MonPanel extends Panel {
  2.   //paramètre de l'ellipse (ovale si tu veux)
  3.   private int x,y,w,h;
  4.   //initialisation du panel
  5.   public MonPanel(int width,int height) {
  6.     this.setSize(width,height);
  7.     //initialisation des dimensions de l'ellipse (on le met au centre du panel)
  8.     x=width/2;
  9.     y=height/2;
  10.     w=Math.max(width/10,5); //pour avoir un rayon = largeur du panel / 10 mais >=5 (sinon on va pas le voir)
  11.     h=Math.max(height/10,5);
  12.   }
  13.   public void paint(Graphics g) {
  14.     super.paint(g);
  15.     g.drawOval(x,y,w,h);
  16.   }
  17.   //deplace à gauche
  18.   public void moveLeft() {
  19.     x--;
  20.     repaint();
  21.   }
  22.   //deplace à droite
  23.   public void moveRigth() {
  24.     x++;
  25.     repaint();
  26.   }
  27.   //deplace vers le haut
  28.   public void moveUp() {
  29.     y--;
  30.     repaint();
  31.   }
  32.   //deplace vers le bas
  33.   public void moveDown() {
  34.     y++;
  35.     repaint();
  36.   }


 
voilà, avec ça, tu instancies un MonPanel de la taille que tu veux, et tu associes un clic sur un bouton à un appel moveXXX()
...
 
bon allez je suis fatigué, bonne nuit !


---------------
get amaroK plugin
Reply

Marsh Posté le 09-10-2002 à 00:41:06    

En AWT, le plus simple pour dessiner est de créer des sous-classes de Canvas, en fait....J'ai pas de code sous la main, là, mais on peut écrire des choses tout à fait très jolies, avec ça...Je te montre du code et des screenshots demain....si j'y pense! :D

Reply

Marsh Posté le 09-10-2002 à 00:55:30    

gfive a écrit a écrit :

En AWT, le plus simple pour dessiner est de créer des sous-classes de Canvas, en fait....J'ai pas de code sous la main, là, mais on peut écrire des choses tout à fait très jolies, avec ça...Je te montre du code et des screenshots demain....si j'y pense! :D




 
ca commence a faire beaucoup pour demain [:ddr555]

Reply

Marsh Posté le 09-10-2002 à 00:55:30   

Reply

Marsh Posté le 09-10-2002 à 11:39:50    

:p
Chaque chose en son temps!! :D
 
Bon, j'ai un truc qui tourne, avec de l'AWT et tout, pout la démo de comment donc on dessine!!!
 
Ca ressemble à ça :  
 
 http://site.voila.fr/gfive/drawer_src.jpg  
 
 
A downloader là :
 http://site.voila.fr/gfive/Draw.tgz  
 
 
Ah, oups, pour le lancer : dézipper, se mettre dans le rep. draw/class créé, puis faire :  
java Demo [width] [height]  
 
(largeur et hauteur du machin)  
 
ouala. Enjoy without moderation et tout.
Bon, c'est un peu peaufiné, mais je suis perfectionniste! :p


Message édité par gfive le 09-10-2002 à 11:41:39
Reply

Marsh Posté le 09-10-2002 à 12:17:08    

ouais en fait, j'y connais rien en AWT  :sarcastic:  
hallala ... belle époque révolue :D

Reply

Marsh Posté le 09-10-2002 à 12:19:50    

Pas révolue!! quand tu veux faire des appets, tu peux pas demander au client final de télécharger le plugin Java2... :D

Reply

Marsh Posté le 09-10-2002 à 12:48:05    

putain ca fou les nerfs la je comprend carrement pas le concept la pour ajouter des formes
 
encore le truc du add(button) c super simple autant pour ajouter un graphics a un endroit voulu la je comprend pas du tout
 
 
ya pas quelqu'un qui pourrais mexplqieru en francais comment ca fonctionnne ce truc
 
jai lut ta source de ton programme c ce que je voudrais avoir mais la je capte pas comment ta fait  
 
voila voila

Reply

Marsh Posté le 09-10-2002 à 15:27:01    

ok bon jy suis arrivé a peu pres mais la un nouveau probleme se pose :
 
 
dans ma procedure paint j'ai mis directement la creation des objet la voici :
 

Code :
  1. fichier : EssaiCanvas.java
  2. public void paint (Graphics g)
  3.    g.setColor(Color.red);
  4. g.fillOval(50,30,80,80);
  5. }

 
 

Code :
  1. fichier Parle.java
  2. import java.awt.event.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.awt.Graphics.*;
  6. import EssaiCanvas;
  7. public class Parle extends Frame
  8. {
  9. Canvas c = new EssaiCanvas();
  10. Panel p = new Panel();
  11. Button parler;
  12. Button chuter;
  13. Frame f;
  14. public Parle()
  15. {
  16.  parler=new Button("Parle !" );
  17.  chuter=new Button("Chut !" );
  18.  p.setBackground(Color.white);
  19.  p.setLayout(new FlowLayout() );
  20.  p.add(parler);
  21.  p.add(chuter);
  22.  f = new Frame();
  23.  f.setSize(200,200);
  24.  f.setLocation(300,300);
  25.  f.add("Center",c);
  26.  f.add("North",p);
  27.  f.show();
  28.  addWindowListener(new WindowAdapter()
  29.  {
  30.   public void windowClosing(WindowEvent e)
  31.   {
  32.    System.exit (0);
  33.   }
  34.  });
  35. }
  36. public static void main(String args[])
  37. {
  38.  Parle prog = new Parle();
  39. }
  40. }


 
Et maintenant j'aimerais que lorsque l'on clique sur un bouton ce ne soit plus un OVAL que j'affiche mais un reactangle par exemple ouu autre chose.
 
 
vous avez une idée ??
merci ;-) :jap:


Message édité par casquetta le 09-10-2002 à 15:39:08
Reply

Marsh Posté le 09-10-2002 à 15:37:08    

casquetta a écrit a écrit :

 

Code :
  1. c.paint(c.getGraphics());






 
c'est quoi cette hérésie ? paint() est pas censé être appelé automatiquement ?

Reply

Marsh Posté le 09-10-2002 à 15:39:43    

désolé cetais un truc que j'ai laissé un vieux trucs que jessayais, mais je lai pas mis dans mon prog
 
voila donc tu saurais pas comment je peut faire ?

Reply

Marsh Posté le 09-10-2002 à 15:44:26    

casquetta a écrit a écrit :

désolé cetais un truc que j'ai laissé un vieux trucs que jessayais, mais je lai pas mis dans mon prog
 
voila donc tu saurais pas comment je peut faire ?




 
ben si j'ai bien compris c'est tout con
 

Code :
  1. static public final int OVAL = 1;
  2.   static public final int RECT = 2;
  3.   int shape = OVAL;
  4.  
  5.   public setShape(int shape)
  6.   {
  7.     this.shape = shape;
  8.   }
  9.   public void paint (Graphics g)
  10.   { 
  11.        g.setColor(Color.red);
  12.        if(this.shape == OVAL)
  13.            g.fillOval(50,30,80,80);
  14.        if(this.shape == RECT)
  15.            ...
  16.   }


 
Et quand tu clique sur un bouton, tu appelles setShape() et repaint().

Reply

Marsh Posté le 09-10-2002 à 15:53:09    

je sais pas si c moi
 
mais la je vois pas comment le placer le bout de code
 
jai tout essayé et ca marche pas, ca menerve, je comprend pas comment fonctionne ces methodes de graphisme !!

Reply

Marsh Posté le 09-10-2002 à 15:55:22    

casquetta a écrit a écrit :

je sais pas si c moi
 
mais la je vois pas comment le placer le bout de code
 
jai tout essayé et ca marche pas, ca menerve, je comprend pas comment fonctionne ces methodes de graphisme !!




 
ben ton machin avec l'ovale marche ? parce que tout ce que t'as a faire c'est modifier paint() pour qu'il dessine un ovale sous certaines condititions et un rectangle sous d'autres().. Je comprends pas trop ton probleme en fait.

Reply

Marsh Posté le 09-10-2002 à 15:58:35    

bah le truc c que mon prog affichant un cercle marche parfaitement
 
maitenant je veut juste qu'il change la forme en cliquant sur un bouton alors je met un gestionaire devenement :
 

Code :
  1. ActionListener al1 = new ActionListener()
  2.  {
  3.   public void actionPerformed(ActionEvent e)
  4.   {
  5.   }
  6.  };
  7.  parler.addActionListener(al1); // parler = bouton


 
 
mais je sais pas quoi mettre dans la méthode pour faire ce que je veut
 
je voudrais par eexemple juste changé la couleur alors que faut t'il mettre dedans ?
et dans la méthode paint ?

Reply

Marsh Posté le 09-10-2002 à 16:01:38    

Bon, donc tu as un objet qu'on va appeler "forme" qui redéfinit la méthode paint. A coté tu as une frame avec des boutons. Cette frame contient "forme". Lors du clic sur un bouton tu appelles une methode de "forme" (dans mon exemple, setShape) de maniere a ce que celui-ci change d'etat. Apres le changement d'état tu demandes a "forme" de se rafraichir via repaint (mais tu peux aussi mettre le repaint dans setShape pour etre peinard). C'est plus clair ?

Reply

Marsh Posté le 09-10-2002 à 16:06:38    

bah ouais jcomprend la
 
mais le probleme c que quand jai mis ton bout de code il me disais  
 
cannot resolve symbol : setShape
 
jai pas compris
cest chiant grave la

Reply

Marsh Posté le 09-10-2002 à 16:08:16    

casquetta a écrit a écrit :

bah ouais jcomprend la
mais le probleme c que quand jai mis ton bout de code il me disais  
cannot resolve symbol : setShape




montre voir le code de la classe qui implémente paint()

Reply

Marsh Posté le 09-10-2002 à 16:14:25    

remonte dans le topic vers le milieu jai collé tout mon code actuel
 
en 2 fichier : Parle.java et EssaiCanvas.java

Reply

Marsh Posté le 09-10-2002 à 17:20:09    

gfive a écrit a écrit :

Pas révolue!! quand tu veux faire des appets, tu peux pas demander au client final de télécharger le plugin Java2... :D




ok ok, mais je fais pas des trucs à distribuer c pour ça !
 ;)


---------------
get amaroK plugin
Reply

Marsh Posté le 09-10-2002 à 17:21:00    

casquetta a écrit a écrit :

remonte dans le topic vers le milieu jai collé tout mon code actuel
 
en 2 fichier : Parle.java et EssaiCanvas.java




 :heink:  
 
je parlais du source modifié pour prendre en compte plusieurs formes...

Reply

Marsh Posté le 09-10-2002 à 17:27:09    

Si tu prends un bouquin à la rubrique gestion d'événements et que tu lis bien les exemples, tu comprendras assez vite comment ça marche .. paske là à part te pondre le code ... bon courage à toi


Message édité par bobuse le 09-10-2002 à 17:27:45

---------------
get amaroK plugin
Reply

Marsh Posté le 09-10-2002 à 18:57:03    

bah franchement vu le prix que coute un livre comme ca jpense pas en acheté
 
bah franchement si tu pouvais me doner la portion de code je letudierais parceque j'ai fait trop de recherche sur le net et je sais que je suis pas loin de ce que je veut mais jarrive pas a trouvé ou est le TRUC
 
merci

Reply

Marsh Posté le 09-10-2002 à 18:59:28    

casquetta a écrit a écrit :

bah franchement vu le prix que coute un livre comme ca jpense pas en acheté




http://penserenjava.free.fr/pens/indexMain_14&0.htm

Reply

Marsh Posté le 09-10-2002 à 20:12:03    

bon voila ou jen suis, ca ne marche pas cause que le compilateur dit ne pas trouvé la fonction setShape(int)
 
 
 
Fichier Parle.Java

Code :
  1. import java.awt.event.*;
  2. import java.awt.*;
  3. import javax.swing.*;
  4. import java.awt.Graphics.*;
  5. public class Parle extends Frame
  6. {
  7. Canvas c = new EssaiCanvas();
  8. Panel p = new Panel();
  9. Button parler;
  10. Button chuter;
  11. Frame f;
  12. int couleur=0;
  13. public Parle()
  14. {
  15.  parler=new Button("Parle !" );
  16.  chuter=new Button("Chut !" );
  17.  p.setBackground(Color.white);
  18.  p.setLayout(new FlowLayout() );
  19.  p.add(parler);
  20.  p.add(chuter);
  21.  f = new Frame();
  22.  f.setSize(200,200);
  23.  f.setLocation(300,300);
  24.  f.add("Center",c);
  25.  f.add("North",p);
  26.  f.show();
  27.  ActionListener al1 = new ActionListener()
  28.  {
  29.   public void actionPerformed(ActionEvent e)
  30.   {
  31.     c.setShape(EssaiCanvas.RECT);
  32.     c.repaint();
  33.   }
  34.  };
  35.  parler.addActionListener(al1);
  36. }
  37. public static void main(String args[])
  38. {
  39.  Parle prog = new Parle();
  40. }
  41. }


 
 
 
fichier EssaiCavans.java
 

Code :
  1. import java.awt.*;
  2. public class EssaiCanvas extends Canvas
  3. static public final int OVAL = 1;
  4.  static public final int RECT = 2;
  5.  int shape = OVAL;
  6.  
  7.  public void setShape(int shape)
  8.  {
  9.    this.shape = shape;
  10.  }
  11.  public void paint (Graphics g)
  12.  { 
  13.        g.setColor(Color.red);
  14.        if(this.shape == OVAL) g.fillOval(50,30,80,80);
  15.        if(this.shape == RECT) g.fillRect(50,30,80,80);
  16.    } 
  17. }


 
 
voila il ne trouve pas setShape surement puisqu'elle est dans une classe différente, enfin jsais pas


Message édité par casquetta le 09-10-2002 à 20:47:51
Reply

Marsh Posté le 09-10-2002 à 20:19:51    

ben voila, ca avance !
 
C'est effectivement une méthode d'un autre objet, il faut donc l'appliquer a cet objet (tout comme repaint) ce qui dans ton cas donne
 
c.setShape(...);
c.repaint();
 
Sinon sans moquerie, tu as déja programmé dans d'autres langages ? Tu sais ce que c'est de la programmation objet ? Parce que serieusement, c'est vrai que les bouquins d'infos sont chers, mais la tu en as sacrément besoin.

Reply

Marsh Posté le 09-10-2002 à 20:21:36    

ah, et si on définit des constantes publiques, c'est pour les utiliser. Donc dans setShape au lieu de passer 2, tu peux passer EssaiCanvas.RECT

Reply

Marsh Posté le 09-10-2002 à 20:23:11    

ouais c'est bon, là tu y es presque ... tu te débrouilles, mais c'est clair que ça reste de la cuisine, il faudrait que tu te fasse un topo sur la programmation orientée objet, à partir de là, je pense que tu pourras faire un tas de choses super interressante ...
 
au fait, tu es étudiant ? en quoi ? (juste pour savoir)


---------------
get amaroK plugin
Reply

Marsh Posté le 09-10-2002 à 20:26:44    

ouais jme debourouille carrement pas mal en objet normallement C++ et JAVA mais la ca me deroute trop les interfaces...jsais pas pkoi d'ailleurs
 
 
mais ca ne resoud pas le probleme car c la methode setShape que le compilateur ne trouve pas...

Reply

Marsh Posté le 09-10-2002 à 20:34:33    

casquetta a écrit a écrit :

ouais jme debourouille carrement pas mal en objet normallement C++ et JAVA mais la ca me deroute trop les interfaces...jsais pas pkoi d'ailleurs
 
 
mais ca ne resoud pas le probleme car c la methode setShape que le compilateur ne trouve pas...




heu ... :heink:  
 
setShape(), c'est la méthode d'un objet que t'as créé ... ok ?
comment t'appelles la méthode d'un objet .... comme ça le compilo, il devine tout seul sur quel objet il doit appliquer la méthode ?
 
non, hein ! Imagines que tu ais maintenant deux canevas c1 et c2, et que suivant le boutons sur le quel t'appuies tu veux veuilles agir sur c1 ou c2 ... comment tu fais ?  
 
 
 
Et ben tu appelleras ta méthode setShape(), ou n'importe quelle autre d'aillueurs) sur l'objet concerné ... donc ici, il faut l'appliquer sur ton objet "c" (ce que loriil t'as déjà fait remarqué)
 
Après si tu te balades en Objet ... [:zebra33]


---------------
get amaroK plugin
Reply

Marsh Posté le 09-10-2002 à 20:38:00    

bobuse a écrit a écrit :

 
heu ... :heink:  
 
setShape(), c'est la méthode d'un objet que t'as créé ... ok ?
comment t'appelles la méthode d'un objet .... comme ça le compilo, il devine tout seul sur quel objet il doit appliquer la méthode ?
 
non, hein ! Imagines que tu ais maintenant deux canevas c1 et c2, et que suivant le boutons sur le quel t'appuies tu veux veuilles agir sur c1 ou c2 ... comment tu fais ?  
 
 
 
Et ben tu appelleras ta méthode setShape(), ou n'importe quelle autre d'aillueurs) sur l'objet concerné ... donc ici, il faut l'appliquer sur ton objet "c" (ce que loriil t'as déjà fait remarqué)
 
Après si tu te balades en Objet ... [:zebra33]  




 
je sais lerreur que ma dit lorill etait une grosse erreur que j'ai faite par inatention, mais la je l'ai corrigé et ca ne change rien au probleme le compilo ne daigne pas trouvé la méthode setShape de la class EssaiCanvas
 
 
ps : jai pas dit que je me ballade jai dit que je me debrouille ;)


Message édité par casquetta le 09-10-2002 à 20:42:30
Reply

Marsh Posté le 09-10-2002 à 20:42:32    

ben c'est que t'as pas corrigé correctement :heink:
edite ton message précedent avec les corrections qu'on y jette un oeil

Reply

Marsh Posté le 09-10-2002 à 20:46:21    

casquetta a écrit a écrit :

 le compilo ne daigne pas trouvé la méthode setShape de la class EssaiCanvas



Ce qui est tout à fait normal puisqu'il n'y a pas d'objet EssaiCanvas dans Parle.

Reply

Marsh Posté le 09-10-2002 à 20:50:47    

ah, suis-je bête... Evidement.
 
c est déclaré dans Parle, et tu essaye d'y accéder dans une classe interne qui ne le connait pas

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed