Partie 1 : Création et Interaction
Ma gestion de la couleur aléatoire (Q1)
J'ai observé que le programme initial utilisait une couleur fixe. J'ai donc modifié le constructeur pour utiliser la fonction Math.random(). Cette méthode me renvoie un nombre décimal entre 0.0 et 1.0. En le multipliant par 256 et en le convertissant en entier, j'obtiens une valeur comprise entre 0 et 255, ce qui me permet de définir dynamiquement les composantes Rouge, Vert et Bleu de ma fenêtre.
Mon ajout du bouton (Q2)
J'ai déclaré un objet JButton que j'ai nommé monBouton. Je l'ai instancié avec le texte "Changer couleur" et je l'ai ajouté à ma fenêtre via la méthode add(). Grâce au gestionnaire FlowLayout, mon bouton se place automatiquement après mon label.
Mon implémentation de l'interaction (Q3)
Afin de rendre mon bouton actif, j'ai fait en sorte que ma classe implémente l'interface ActionListener. J'ai abonné ma fenêtre aux événements du bouton avec monBouton.addActionListener(this). Enfin, j'ai écrit ma méthode actionPerformed pour détecter mon clic, afficher un message en console et recalculer ma couleur de fond aléatoirement.
Partie 2 : Ma démarche de modularité
Mon objectif était de structurer mon programme en composants réutilisables en séparant mon code en deux classes :
- Mon fichier Panneau.java (Q4) : Ma classe hérite de
JPanel et encapsule toute ma logique (bouton, label, couleur) sans méthode main.
- Mon fichier ChargePanneau.java (Q5) : Ma classe hérite de
JFrame et me sert de conteneur pour ajouter mes instances de Panneau.
Pour répondre à la question 5, j'ai chargé trois instances de
Panneau dans un
GridLayout(3, 1). Chaque panneau est pour moi un objet indépendant en mémoire possédant ses propres variables.
Partie 3 : Mon analyse théorique
Question 6 : Si j'utilisais le mot-clé static
Si je déclarais ma variable couleur avec le mot-clé
static, elle ne serait plus propre à chaque objet mais deviendrait une
variable de classe.
Voici ce que j'ai analysé comme conséquences :
- Ma variable serait unique et partagée par toutes mes instances de
Panneau.
- Mes panneaux auraient tous la même couleur car chaque nouveau calcul écraserait la valeur précédente.
- Si je cliquais sur un bouton, je modifierais la variable commune, ce qui changerait l'affichage de tous mes panneaux en même temps, brisant l'indépendance établie.
Mes Codes Complets
1. Fenetre.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Fenetre extends JFrame implements ActionListener {
JLabel monLabel;
JButton monBouton;
public Fenetre() {
super("Fenêtre de composants");
int r = (int)(Math.random() * 256);
int v = (int)(Math.random() * 256);
int b = (int)(Math.random() * 256);
getContentPane().setBackground(new Color(r, v, b));
setSize(350, 250);
setLayout(new FlowLayout());
monLabel = new JLabel("Mon composant :", SwingConstants.CENTER);
monLabel.setFont(new Font("Arial", Font.BOLD, 20));
add(monLabel);
monBouton = new JButton("Changer couleur");
monBouton.addActionListener(this);
add(monBouton);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == monBouton) {
System.out.println("Clic sur le bouton.");
int r = (int)(Math.random() * 256);
int v = (int)(Math.random() * 256);
int b = (int)(Math.random() * 256);
getContentPane().setBackground(new Color(r, v, b));
repaint();
}
}
public static void main(String a[]) {
new Fenetre();
}
}
2. Panneau.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Panneau extends JPanel implements ActionListener {
JLabel monLabel;
JButton monBouton;
public Panneau() {
int r = (int)(Math.random() * 256);
int v = (int)(Math.random() * 256);
int b = (int)(Math.random() * 256);
this.setBackground(new Color(r, v, b));
monLabel = new JLabel("Mon composant : ");
monLabel.setFont(new Font("Arial", Font.BOLD, 20));
add(monLabel);
monBouton = new JButton("Clic sur moi");
monBouton.addActionListener(this);
add(monBouton);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == monBouton) {
int r = (int)(Math.random() * 256);
int v = (int)(Math.random() * 256);
int b = (int)(Math.random() * 256);
this.setBackground(new Color(r, v, b));
repaint();
}
}
}
3. ChargePanneau.java
import java.awt.*;
import javax.swing.*;
public class ChargePanneau extends JFrame {
public ChargePanneau() {
super("Fenêtre de composants - TD01");
setSize(400, 450);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(3, 1));
add(new Panneau());
add(new Panneau());
add(new Panneau());
setVisible(true);
}
public static void main(String args[]) {
new ChargePanneau();
}
}