Compte-Rendu TP01 : Gestion des composants et héritage

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.
Ma fenêtre avec couleur aléatoire 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.
Mon test d'interaction

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.
Mes trois panneaux indépendants

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();
    }
}

Télécharger mes fichiers externes :

Fenetre.java Panneau.java ChargePanneau.java