Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question de débutant

4 réponses
Avatar
patrick
Bonjour, je débute en Java (et en programmation tout cours ...) et je ne
comprend pas quelque chose dans le code ci dessous :

import java.awt.Frame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.AWTEvent;
import java.awt.event.WindowEvent;

public class FillSquares extends Frame {
public static void main(String arg[]) {
new FillSquares();
}
FillSquares() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
FSquares squares = new FSquares();
add(squares);
pack();
show();
}
public void processWindowEvent(WindowEvent event) {
if(event.getID() == WindowEvent.WINDOW_CLOSING)
System.exit(0);
}
}

class FSquares extends Canvas {
FSquares() {
setSize(200,200);
setBackground(Color.magenta);
}
public void paint(Graphics g) {
g.setColor(Color.yellow);
g.fillRect(20,20,160,160);
g.setColor(Color.red);
g.fillRect(40,40,120,120);
g.setColor(Color.blue);
g.fillRect(60,60,80,80);
}
}

Ce code affiche une fenêtre avec plusieurs carrés imbriqués de couleurs
différentes.

D'après ce que je comprend du code, la fonction paint s'occupe de
colorier les carrés en différentes couleurs. Le problème est que dans
ma compréhension des choses, paint est juste une fonction qui est
déclarée au sein de la classe FSQuares. Je ne vois donc pas où cette
fonction paint est appelée pour être exécutée ?

Pardon pour la trivialité de cette question et merci d'avance à qui
pourra m'éclairer.

Patrick

4 réponses

Avatar
remy
patrick a écrit :


bonjour

class FSquares extends Canvas {
FSquares() {
setSize(200,200);
setBackground(Color.magenta);
}
public void paint(Graphics g) {
g.setColor(Color.yellow);
g.fillRect(20,20,160,160);
g.setColor(Color.red);
g.fillRect(40,40,120,120);
g.setColor(Color.blue);
g.fillRect(60,60,80,80);
}
}

Ce code affiche une fenêtre avec plusieurs carrés imbriqués de co uleurs
différentes.

D'après ce que je comprend du code, la fonction paint s'occupe de
colorier les carrés en différentes couleurs. Le problème est que dans
ma compréhension des choses, paint est juste une fonction qui est
déclarée au sein de la classe FSQuares. Je ne vois donc pas où c ette
fonction paint est appelée pour être exécutée ?

Pardon pour la trivialité de cette question et merci d'avance à qui
pourra m'éclairer.




aucun problème



class FSquares extends Canvas {
...
public void paint(Graphics g) {

en gros tu surcharges la fonction paint de l'obj Canvas
le jmv va lire ton obj FSquares qui est une spécialisation d'un obj
Canvas le fameux " extends Canvas" dans class FSquares extends Canvas {

donc la jmv sait qu'il y a une fonction paint, elle va donc la chercher
et l'afficher

tu as aussi une fontion paint dans ta frame, une bonne source d'info et
d'apprentissage, recherche sur ton disque un fichier src.zip
puis un fichier frame.java

tu vas tomber sur

*
* @version 1.163, 10/31/08
* @author Sami Shaio
* @see WindowEvent
* @see Window#addWindowListener
* @since JDK1.0
*/
public class Frame extends Window implements MenuContainer {

puis le fichier window.java



* @version 1.240, 03/15/06
* @author Sami Shaio
* @author Arthur van Hoff
* @see WindowEvent
* @see #addWindowListener
* @see java.awt.BorderLayout
* @since JDK1.0
*/
public class Window extends Container implements Accessible {


et dans le fichier container.java tu auras ta fonction paint

mais il vaut mieux utiliser un obj canvas c'est plus élégant
bien que pour des "gros" projets je préfère utiliser un obj graghic q ue
je passe à la fonction paint qui se débrouille ,l'on appelle cela un e
frame buffeur

par contre oublies l'awt et utilises plutôt les objs swing les obj
graphiques avec un j devant

mes 3 centimes d'euro

remy


--
http://remyaumeunier.chez-alice.fr/
Avatar
Alain Ketterlin
patrick writes:

public class FillSquares extends Frame {
public static void main(String arg[]) {
new FillSquares();
}
FillSquares() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
FSquares squares = new FSquares();
add(squares);
pack();
show();
}
public void processWindowEvent(WindowEvent event) {
if(event.getID() == WindowEvent.WINDOW_CLOSING)
System.exit(0);
}
}


[...]
D'après ce que je comprend du code, la fonction paint s'occupe de
colorier les carrés en différentes couleurs. Le problème est que dans
ma compréhension des choses, paint est juste une fonction qui est
déclarée au sein de la classe FSQuares. Je ne vois donc pas o ù cette
fonction paint est appelée pour être exécutée ?



Regarde où tu "perds le contrôle" de ton application : main() app elle le
constructeur de FillSquares, qui construit une Frame (en fait lui-même ),
qui appelle show().

C'est show() qui prend le contrôle ensuite et attends qu'il se passe
qu'elle chose (que tu cliques, etc.). Et la première chose qui se pass e,
c'est qu'il doit dessiner la Frame, donc le Canvas à l'intérieur, et
donc il faut le peindre. Et par définition, peindre un Canvas signifie
appeler paint().

[En fait, ce que j'écris est inexact parce qu'il y a une histoire de
thread, etc. Mais le principe est celui-là.]

Pardon pour la trivialité de cette question et merci d'avance à qui
pourra m'éclairer.



Ce n'est pas du tout trivial. Certains appellent cela de la
programmation événementielle, mais le terme est galvaudé. L' idée est que
ton programme crée une structure de fenêtres imbriquées, et laisse
ensuite la main à ce qu'on appelle une "main loop", chargée de r éagir
aux événements. Ces réactions doivent respecter un protocole . Il y a un
exemple dans ton code (processWindowEvent) : tout événement sur la
fenêtre provoque un appel de cette méthode. Le code ci-dessus r éagit à
un seul événement (WINDOW_CLOSING). La méthode ne fait rien pour les
autres types d'événements, mais du point de vue de la "main loop" elle a
fait son travail.

Du coup, ton programme n'a pas du tout l'air d'un programme complet,
mais d'une collection de méthodes dont le rôle est de réagir
ponctuellement aux événements. Le "vrai" programme principal, c'e st la
"main loop". Et comme cette main loop est tout le temps la même, elle
est écrite une bonne fois pour toutes (dans show(), disons).

-- Alain.
Avatar
remy
remy a écrit :

pour être plus clair, si la question est je ne comprends pas pourquoi
cela marche puisque je n'appelle pas la fonction paint
quand je dis

" la jmv sait qu'il y a une fonction paint, elle va donc la chercher
et l'afficher " cela veut dire que dans le processus d'initialisation
des d'obj, il y a un appel à fct paint et c'est ma surcharge qui est
exécutée

en gros et en détail (pour paint c'est exactement la même chose)

un seul fichier test.java je sais c'est pas bien


*********************
public class test
{
public static void main(String args[])
{
FillSquares fs=new FillSquares();
fs.affiche();
}
}

class A
{
A()
{
}
public void affiche()
{
info();
}
public void info()
{
System.out.println("a");
}
}
class B extends A
{
B()
{
super();
}
public void affiche()
{
infoB();
super.affiche();
}
public void infoB()
{
System.out.println("b");
}

}
class C extends B
{
C()
{
super();
}
public void affiche()
{
infoC();
super.affiche();
}
public void infoC()
{
System.out.println("c");
}

}
class FillSquares extends C
{
FillSquares()
{
super();
}
public void info()
{
System.out.println("FSquares");
}

}

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

:~/Bureau$ javac test.java
:~/Bureau$ java test
c
b
FSquares
:~/Bureau$

le même sans la fonction info dans FillSquares


:~/Bureau$ javac test.java
:~/Bureau$ java test
c
b
a
:~/Bureau$

c'est en gros toute la puissance de la programmation obj


remy

ps les constructeurs sont inutiles mais je les ai laissés pour
facilité la lecture


--
http://remyaumeunier.chez-alice.fr/
Avatar
Patrick
Merci pour vos réponses. Je vais maintenant essayer de les comprendre ;-)


On 3/12/2010 10:48 AM, patrick wrote:
Bonjour, je débute en Java (et en programmation tout cours ...) et je ne
comprend pas quelque chose dans le code ci dessous :

import java.awt.Frame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.AWTEvent;
import java.awt.event.WindowEvent;

public class FillSquares extends Frame {
public static void main(String arg[]) {
new FillSquares();
}
FillSquares() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
FSquares squares = new FSquares();
add(squares);
pack();
show();
}
public void processWindowEvent(WindowEvent event) {
if(event.getID() == WindowEvent.WINDOW_CLOSING)
System.exit(0);
}
}

class FSquares extends Canvas {
FSquares() {
setSize(200,200);
setBackground(Color.magenta);
}
public void paint(Graphics g) {
g.setColor(Color.yellow);
g.fillRect(20,20,160,160);
g.setColor(Color.red);
g.fillRect(40,40,120,120);
g.setColor(Color.blue);
g.fillRect(60,60,80,80);
}
}

Ce code affiche une fenêtre avec plusieurs carrés imbriqués de couleurs
différentes.

D'après ce que je comprend du code, la fonction paint s'occupe de
colorier les carrés en différentes couleurs. Le problème est que dans ma
compréhension des choses, paint est juste une fonction qui est déclarée
au sein de la classe FSQuares. Je ne vois donc pas où cette fonction
paint est appelée pour être exécutée ?

Pardon pour la trivialité de cette question et merci d'avance à qui
pourra m'éclairer.

Patrick