(JAVA) probleme avec Graphics
Fermé
sky88
Messages postés
59
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
4 juillet 2011
-
30 août 2008 à 00:55
sky88 Messages postés 59 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 4 juillet 2011 - 31 août 2008 à 00:21
sky88 Messages postés 59 Date d'inscription mardi 18 mars 2008 Statut Membre Dernière intervention 4 juillet 2011 - 31 août 2008 à 00:21
A voir également:
- (JAVA) probleme avec Graphics
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java décompiler - Télécharger - Langages
12 réponses
Salut,
ton programme est incomplet, mais il semble que tu essaye de conserver la référence de l'objet Graphics qui est passé à la méthode paintComponent(), que tu garde dans la variable g private.
Il faut savoir que cette méthode envoie précisément le Graphics, parce qu'il est suceptible de changer à chaque fois : il s'agit d'un contexte graphique, qui n'a de vie que le temps de l'appel à la méthode paintComponent.
Tu ne peux donc pas le garder en espérant le réutiliser pour le prochain paintComponent, et encore moins pour le paintComponent d'un autre objet.
Ce que je ne vois pas, c'est pourquoi tu veut le conserver ? Est-ce parce que le traitement est trop long ?
ton programme est incomplet, mais il semble que tu essaye de conserver la référence de l'objet Graphics qui est passé à la méthode paintComponent(), que tu garde dans la variable g private.
Il faut savoir que cette méthode envoie précisément le Graphics, parce qu'il est suceptible de changer à chaque fois : il s'agit d'un contexte graphique, qui n'a de vie que le temps de l'appel à la méthode paintComponent.
Tu ne peux donc pas le garder en espérant le réutiliser pour le prochain paintComponent, et encore moins pour le paintComponent d'un autre objet.
Ce que je ne vois pas, c'est pourquoi tu veut le conserver ? Est-ce parce que le traitement est trop long ?
Bonsoir.
Je n'ai pas été assez clair. Je vais essayer d'être lus précis.
Tu as une classe nommée MonPanel
cette classe possède une méthode nomée paintComponent(Graphics g1) que tu as toi même définie.
Il faut savoir que cette méthode ne dois jamais être appelée implicitement : elle sera appelée automatiquement par le run time java, suite à divers événements :
- 1ère exécution du programme.
- Fenêtre partiellement ou totalement masquée à nouveau visible.
-Evénement déclenché par programme.
C'est ce troisième mode que nous allons utiliser.
Ce que je propose, c'est que tu utilise la méthode repaint() de JPanel() et donc de MonPanel pour déclencher l'appel à paintComponent() qu'il est interdit d'appeler directement.
Mais, pour que selon le contexte, la méthode paintcomponent dessine des choses ou des couleurs différentes, on va rajouter des attributsde couleur à l'objet MonPanel.
Ce que tu dois faire :
1) Ajouter un ou plusieurs attributs de type Color dans la classe MonPanel : ces attributs vont servir à stoker les différentes couleurs variables de ton dessin.
2) Ajouter une méthode void redessine(Color couleur1, Couleur couleur2, ...) à la classe MonPanel qui va contenir ce que j'ai dit précédemment (affectation des atributs de couleurs à mémoriser, et appel de la méthode repaint();
3) Modifier ta méthode Monpanel.paintComponent() pour qu'elle se serve des attributs de couleur de la classe (mettre les valeur initiales comme valeurs par défaut.
Modifier la classe que j'ai appelée ControleurUtilisateur en faisant ce qui suit :
4) Ajouter une donnée membre de type MonPanel a qui on donnera la valeur de l'objet monPanel (peut être il faudra rajouter une méthode setPanel(MonPanel p).
5) Modifier la méthode de validation d'entrée utilisateur pour appeler la méthode monPanel.redessine(c1,C2...) avec les couleurs appropriées au contexte
Séquencement : je donne ici un séquencement simple, adapte le au tiens.
Appelons monpanel l'objet de type MonPanel.
Appelons controleurUtilisateur l'objet de la classe ControleurUtilisateur que tu as dû créer pour gérer les réponses de l'utilisateur (tu l'as appelé autrement, mais c'est sans importance.
public static void main(char[] args)
{
MonPanel monPanel = new MonPanel();
ControleurUtilisateur controleurUtilisateur = new ControleurUtilisateur();
controleurUtilisateur.setMonPanel(monPanel);
// suite du code qui crée une Frame, et place le panel dans la frame (je suppose)
}
Dans la méthode qui intercepte un événement utilisateur (je suppose que tu as un listener quelque part)
tu place un appel à controleurUtilisateur.getMonPanel().redessine(couleur1, couleur2 ...)
Je ne connais pas ton niveau en java, donc je ne sais pas si je suis assez clair.
si tu ne comprend toujours pas, n'hésites pas à me demander des précisions.
Un dessin serait mieux, mais a ne passe pas ici. si tu en as besoin et que tu peux m'indiquer une adresse, je pourrais toujours t'envoyer un mail.
Je n'ai pas été assez clair. Je vais essayer d'être lus précis.
Tu as une classe nommée MonPanel
cette classe possède une méthode nomée paintComponent(Graphics g1) que tu as toi même définie.
Il faut savoir que cette méthode ne dois jamais être appelée implicitement : elle sera appelée automatiquement par le run time java, suite à divers événements :
- 1ère exécution du programme.
- Fenêtre partiellement ou totalement masquée à nouveau visible.
-Evénement déclenché par programme.
C'est ce troisième mode que nous allons utiliser.
Ce que je propose, c'est que tu utilise la méthode repaint() de JPanel() et donc de MonPanel pour déclencher l'appel à paintComponent() qu'il est interdit d'appeler directement.
Mais, pour que selon le contexte, la méthode paintcomponent dessine des choses ou des couleurs différentes, on va rajouter des attributsde couleur à l'objet MonPanel.
Ce que tu dois faire :
1) Ajouter un ou plusieurs attributs de type Color dans la classe MonPanel : ces attributs vont servir à stoker les différentes couleurs variables de ton dessin.
2) Ajouter une méthode void redessine(Color couleur1, Couleur couleur2, ...) à la classe MonPanel qui va contenir ce que j'ai dit précédemment (affectation des atributs de couleurs à mémoriser, et appel de la méthode repaint();
3) Modifier ta méthode Monpanel.paintComponent() pour qu'elle se serve des attributs de couleur de la classe (mettre les valeur initiales comme valeurs par défaut.
Modifier la classe que j'ai appelée ControleurUtilisateur en faisant ce qui suit :
4) Ajouter une donnée membre de type MonPanel a qui on donnera la valeur de l'objet monPanel (peut être il faudra rajouter une méthode setPanel(MonPanel p).
5) Modifier la méthode de validation d'entrée utilisateur pour appeler la méthode monPanel.redessine(c1,C2...) avec les couleurs appropriées au contexte
Séquencement : je donne ici un séquencement simple, adapte le au tiens.
Appelons monpanel l'objet de type MonPanel.
Appelons controleurUtilisateur l'objet de la classe ControleurUtilisateur que tu as dû créer pour gérer les réponses de l'utilisateur (tu l'as appelé autrement, mais c'est sans importance.
public static void main(char[] args)
{
MonPanel monPanel = new MonPanel();
ControleurUtilisateur controleurUtilisateur = new ControleurUtilisateur();
controleurUtilisateur.setMonPanel(monPanel);
// suite du code qui crée une Frame, et place le panel dans la frame (je suppose)
}
Dans la méthode qui intercepte un événement utilisateur (je suppose que tu as un listener quelque part)
tu place un appel à controleurUtilisateur.getMonPanel().redessine(couleur1, couleur2 ...)
Je ne connais pas ton niveau en java, donc je ne sais pas si je suis assez clair.
si tu ne comprend toujours pas, n'hésites pas à me demander des précisions.
Un dessin serait mieux, mais a ne passe pas ici. si tu en as besoin et que tu peux m'indiquer une adresse, je pourrais toujours t'envoyer un mail.
Le scénarios que tu me donne correspond bien à ce que tu m'as dit jusqu'à présent, et j'avais bien compris le mécanisme global.
Tout ce que j'ai dit jusqu'à présent est applicable à ce scénario.
Simplement, à part en faisant un dessin (ou plutôt plusieurs dessins) ou en donnant des sources de programme, je ne vois pas comment t'expliquer d'avantage.
Or je ne peux pas coller de dessin ici, et pour les sources, je ne vais quand même pas écrire le programme à ta place, même si ça a l'air d'un programme plutôt ludique ?
Si tu veux que je te fasse des petits dessin, envoie moi un email. De toute façon, ce sera pour plus tard, je vais aller me coucher. A bientôt !
Tout ce que j'ai dit jusqu'à présent est applicable à ce scénario.
Simplement, à part en faisant un dessin (ou plutôt plusieurs dessins) ou en donnant des sources de programme, je ne vois pas comment t'expliquer d'avantage.
Or je ne peux pas coller de dessin ici, et pour les sources, je ne vais quand même pas écrire le programme à ta place, même si ça a l'air d'un programme plutôt ludique ?
Si tu veux que je te fasse des petits dessin, envoie moi un email. De toute façon, ce sera pour plus tard, je vais aller me coucher. A bientôt !
L'objet Panel est le responsable unique de son dessin, c'est donc lui qu'il faut prévenir si le dessin doit être modifié.
Concrètement, tu peux faire qq chose comme ça :
L'objet nommé MonPanel va avoir des attributs du genre :
private Color couleurCercle1 = Color.XXX; // la valeur initiale
private Color coleurcercle2 = Color.YYY;
etc..
Il aura une méthode nommée par exemple
void redessine(Color couleur1, Color couleur2, ...)
{
// cette méthode va stocker les changement de couleurs
couleurCercle1 = couleur1;
couleurCercle2 = couleur2;
...
// puis elle demande au panel de se repeindre :
repaint();
// Et comme ta méthode paintcomponent () a accès au menbre private des couleurs modifiées, on pourra voir le //changement de couleur.
// Bien sûr, ce que je propose ici est le minimum, mais sur cette base, je pense que tu dois pouvoir faire ce que tu
// veux Ok ?
}
Concrètement, tu peux faire qq chose comme ça :
L'objet nommé MonPanel va avoir des attributs du genre :
private Color couleurCercle1 = Color.XXX; // la valeur initiale
private Color coleurcercle2 = Color.YYY;
etc..
Il aura une méthode nommée par exemple
void redessine(Color couleur1, Color couleur2, ...)
{
// cette méthode va stocker les changement de couleurs
couleurCercle1 = couleur1;
couleurCercle2 = couleur2;
...
// puis elle demande au panel de se repeindre :
repaint();
// Et comme ta méthode paintcomponent () a accès au menbre private des couleurs modifiées, on pourra voir le //changement de couleur.
// Bien sûr, ce que je propose ici est le minimum, mais sur cette base, je pense que tu dois pouvoir faire ce que tu
// veux Ok ?
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Attends ! il ne faut pas rajouter une méthode main(), tu en as forcément une dans une de tes classes, puisque tout programme java démarre par cette méthode.
Je te donnais juste un exemple pour montrer la visibilité nécessaire entre la classe MonPanel et la classe du contrôleur.
Au passage, je te conseille d'utiliser des noms de classes et d'objets parlant plutôt que des B1 ou C4 qui ne veulent rien dire, et sont sources de confusion.
En java,ou d'ailleurs avec la plupart des langages objets, tous les objets ne voient pas forcément tous les autres objets d'un programme.
C'est d'ailleurs un des critères de qualités (ou pattern) nommé "faible couplage" en théorie Objet. : c'est joli, çà non ?
Bref, quand tu dis que tu ne peux pas appeler un classe, c'est tout simplement qu'il n'y a pas de visibilité (ou de couplage) entre les 2 classes que tu veux faire parler.
Que veut-on :
que la classe qui crée l'objet de ta classe MonPanel (celle qui fait un new MonPanel()) puisse passer, soit dans le constructeur soit par une méthode setMonPanel(MonPanel p) la référence de l'objet monPanel à la classe qui contient le bouton (ou le bouton lui même, si c'est une classe dérivée de JButton) de façon à ce que la méthode appelée lorsqu'on clique sur le bouton B1 appelle la méthode redessine(couleur1, couleur1 ...) qui va elle même déclencher l'appel à repaint, qui va provoquer le redessin du panel avec les nouvelles couleurs stockées dans MonPanel.
Donc ce que tu as a faire, c'est faire en sorte que la classe qui reçoit l'événement utilisateur ait une visibilité sur l'objet de classe MonPanel afin d'appeler au moment voulu la méthode redessine() de celui-ci. C'est tout !
Ce que j'ignore, c'est si c'est toi qui a écrit l'ensemble des classes, ou pas, ce qui si ce n'est pas le cas risque de te compliquer la tâche. Mais courage, si on réfléchi juste à ce qu'on veut faire, on y arrive toujours. Le java, c'est magique, et on peut tout faire avec. Si, c'est vrai !
Je te donnais juste un exemple pour montrer la visibilité nécessaire entre la classe MonPanel et la classe du contrôleur.
Au passage, je te conseille d'utiliser des noms de classes et d'objets parlant plutôt que des B1 ou C4 qui ne veulent rien dire, et sont sources de confusion.
En java,ou d'ailleurs avec la plupart des langages objets, tous les objets ne voient pas forcément tous les autres objets d'un programme.
C'est d'ailleurs un des critères de qualités (ou pattern) nommé "faible couplage" en théorie Objet. : c'est joli, çà non ?
Bref, quand tu dis que tu ne peux pas appeler un classe, c'est tout simplement qu'il n'y a pas de visibilité (ou de couplage) entre les 2 classes que tu veux faire parler.
Que veut-on :
que la classe qui crée l'objet de ta classe MonPanel (celle qui fait un new MonPanel()) puisse passer, soit dans le constructeur soit par une méthode setMonPanel(MonPanel p) la référence de l'objet monPanel à la classe qui contient le bouton (ou le bouton lui même, si c'est une classe dérivée de JButton) de façon à ce que la méthode appelée lorsqu'on clique sur le bouton B1 appelle la méthode redessine(couleur1, couleur1 ...) qui va elle même déclencher l'appel à repaint, qui va provoquer le redessin du panel avec les nouvelles couleurs stockées dans MonPanel.
Donc ce que tu as a faire, c'est faire en sorte que la classe qui reçoit l'événement utilisateur ait une visibilité sur l'objet de classe MonPanel afin d'appeler au moment voulu la méthode redessine() de celui-ci. C'est tout !
Ce que j'ignore, c'est si c'est toi qui a écrit l'ensemble des classes, ou pas, ce qui si ce n'est pas le cas risque de te compliquer la tâche. Mais courage, si on réfléchi juste à ce qu'on veut faire, on y arrive toujours. Le java, c'est magique, et on peut tout faire avec. Si, c'est vrai !
pas de panique, je n'ai absolument pas l'intention de porter un jugement de valeur sur toi. De toute façon, c'est effectivement difficile de comprendre la conception avec seulement des phrases, et c'est pour ça qu'UML a été créé.
Si tu penses qu'un diagramme de type UML peut t'aider, je veux bien t'en faire un si tu me donne un email où l'envoyer.
Mais si tu peux de ton côté m'envoyer un petit descriptif (et le noms) des différentes classes concernées, ça me permettrait de parler avec des éléments que tu connais, ce qui serait plus facile. En plus je pourrais d'indiquer ce qui manque.
Si tu penses qu'un diagramme de type UML peut t'aider, je veux bien t'en faire un si tu me donne un email où l'envoyer.
Mais si tu peux de ton côté m'envoyer un petit descriptif (et le noms) des différentes classes concernées, ça me permettrait de parler avec des éléments que tu connais, ce qui serait plus facile. En plus je pourrais d'indiquer ce qui manque.
sky88
Messages postés
59
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
4 juillet 2011
5
30 août 2008 à 01:44
30 août 2008 à 01:44
merci de votre réponse
dans un premier temps je dessine en ensemble de cercles aprés dans une autre classe d'aprés le choix de l'utilisateur je change la couleur de certains cercles
comment je peux faire pour modifier mon graphe
dans un premier temps je dessine en ensemble de cercles aprés dans une autre classe d'aprés le choix de l'utilisateur je change la couleur de certains cercles
comment je peux faire pour modifier mon graphe
sky88
Messages postés
59
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
4 juillet 2011
5
30 août 2008 à 21:04
30 août 2008 à 21:04
merci mais pardon je n'ai pas bien compris
sky88
Messages postés
59
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
4 juillet 2011
5
30 août 2008 à 22:37
30 août 2008 à 22:37
merci j'ai compris mais puisque je vais ajouter cette partie
public static void main(char[] args)
{
}
donc cette cllasse je n'arrive pas à l'appeler par d'autres classes
ce que j'ai moi une classeprincipale C1 qui contient un bouton B1 quand je clique sur B1 j'appelle la classe C2 qui vva me faire le raitement du dessin et le changement de couleur.
public static void main(char[] args)
{
}
donc cette cllasse je n'arrive pas à l'appeler par d'autres classes
ce que j'ai moi une classeprincipale C1 qui contient un bouton B1 quand je clique sur B1 j'appelle la classe C2 qui vva me faire le raitement du dessin et le changement de couleur.
sky88
Messages postés
59
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
4 juillet 2011
5
30 août 2008 à 23:23
30 août 2008 à 23:23
pardon vous allez dire que je suis un peu bête mais franchement avec que des phrases je ne comprends rien est ce qu'il est possible de me donner un schema général de ce que ous voulez m'expliquer et je vais moi même faire ce qu'il faut
le probleme c'est que je ne connais pas vraiment ce langage par ce que c'est mon premier programme avec java
pardon
le probleme c'est que je ne connais pas vraiment ce langage par ce que c'est mon premier programme avec java
pardon
sky88
Messages postés
59
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
4 juillet 2011
5
30 août 2008 à 23:51
30 août 2008 à 23:51
merci OK je vais te dire ce que je vais faire de A à Z
j'aiune classe principale je vais l'appeler C1, de cette classe je vais récuperer un nombre(m) qui va me servir pour appeler la classe qui va me dessiner m cercles, cette derniere classe me crée JFrame qui contient un JPanel où je dessiner mes cercles, elle contiet aussi un bouton qui ouvre une boite de dialogue avec l'utilisateur,
l'utilisateur va choisir un numéro de cerle et pour l'indiquer je vais changer sa couleur c'est une partie de mon projet
merci
essayez de m'aidez si vous pouvez SVP
merci à vous
j'aiune classe principale je vais l'appeler C1, de cette classe je vais récuperer un nombre(m) qui va me servir pour appeler la classe qui va me dessiner m cercles, cette derniere classe me crée JFrame qui contient un JPanel où je dessiner mes cercles, elle contiet aussi un bouton qui ouvre une boite de dialogue avec l'utilisateur,
l'utilisateur va choisir un numéro de cerle et pour l'indiquer je vais changer sa couleur c'est une partie de mon projet
merci
essayez de m'aidez si vous pouvez SVP
merci à vous
sky88
Messages postés
59
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
4 juillet 2011
5
31 août 2008 à 00:21
31 août 2008 à 00:21
merci à vous je sais que je t'ai dérangé beaucoup pardon pour le dérangement je vais essayer de faire ça moi même si mes questions vous ensembles dérangeante
merci
merci