2025-12-19 10:49:27 +01:00
|
|
|
|
package fr.iutfbleau.sae.vconverter;
|
2025-12-27 10:20:24 +01:00
|
|
|
|
import fr.iutfbleau.sae.util.Config;
|
2025-12-20 00:30:14 +01:00
|
|
|
|
import java.awt.*;
|
|
|
|
|
|
import java.util.Map;
|
2025-12-27 10:20:24 +01:00
|
|
|
|
import javax.swing.*;
|
|
|
|
|
|
import java.awt.image.BufferedImage;
|
2025-12-20 00:30:14 +01:00
|
|
|
|
|
2025-12-19 10:49:27 +01:00
|
|
|
|
/**
|
|
|
|
|
|
* Fenêtre principale du convertisseur.
|
|
|
|
|
|
*
|
|
|
|
|
|
* <p>
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* Cette classe correspond à la vue principale de l’application.
|
|
|
|
|
|
* Elle centralise l’affichage des informations liées à la conversion
|
|
|
|
|
|
* d’une image (aperçu, fréquences, codes).
|
2025-12-19 10:49:27 +01:00
|
|
|
|
* </p>
|
|
|
|
|
|
*
|
|
|
|
|
|
*
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* <p>
|
|
|
|
|
|
* Elle sert de point d’entrée unique pour la partie graphique
|
|
|
|
|
|
* </p>
|
2025-12-19 10:49:27 +01:00
|
|
|
|
*/
|
2025-12-20 00:30:14 +01:00
|
|
|
|
public class ConverterWindow extends JFrame {
|
2025-12-19 10:49:27 +01:00
|
|
|
|
|
|
|
|
|
|
private ImagePreviewPanel imagePreviewPanel;
|
|
|
|
|
|
private FrequencyTablePanel frequencyTablePanel;
|
|
|
|
|
|
private CodeTablePanel codeTablePanel;
|
|
|
|
|
|
|
2025-12-20 00:30:14 +01:00
|
|
|
|
|
|
|
|
|
|
|
2025-12-19 10:49:27 +01:00
|
|
|
|
/**
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* Crée la fenêtre principale du convertisseur.
|
2025-12-19 10:49:27 +01:00
|
|
|
|
*
|
|
|
|
|
|
* <p>
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* Le constructeur initialise la fenêtre et met en place
|
|
|
|
|
|
* les différents panneaux graphiques utilisés pour l’affichage.
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
public ConverterWindow() {
|
|
|
|
|
|
|
|
|
|
|
|
System.out.println("Création de la fenêtre : " + Config.CON_NAME); // debug
|
|
|
|
|
|
// Configuration de la fenetre
|
|
|
|
|
|
this.setTitle(Config.CON_NAME);
|
|
|
|
|
|
this.setSize(Config.CONVERTISSEUR_FENETRE_TAILLE[0],
|
|
|
|
|
|
Config.CONVERTISSEUR_FENETRE_TAILLE[1]);
|
|
|
|
|
|
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
|
|
|
this.setLocationRelativeTo(null); // Centre la fenêtre
|
|
|
|
|
|
this.setResizable(true); // on autorise le resize (plus moderne)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Initialisation des panels
|
|
|
|
|
|
this.imagePreviewPanel = new ImagePreviewPanel();
|
|
|
|
|
|
this.frequencyTablePanel = new FrequencyTablePanel();
|
|
|
|
|
|
this.codeTablePanel = new CodeTablePanel();
|
|
|
|
|
|
|
|
|
|
|
|
// Je gere le panel principal
|
|
|
|
|
|
JPanel contentPanel = new JPanel();
|
|
|
|
|
|
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
|
|
|
|
|
|
contentPanel.setBackground(new Color(255, 0, 0)); // rouge vif pour demo
|
|
|
|
|
|
contentPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
|
|
|
|
|
|
|
|
|
|
|
|
// Titre
|
|
|
|
|
|
JLabel header = new JLabel(" Convertisseur PIF – Visualisation des données ");
|
|
|
|
|
|
header.setFont(new Font("SansSerif", Font.BOLD, 18));
|
|
|
|
|
|
header.setAlignmentX(Component.CENTER_ALIGNMENT);
|
|
|
|
|
|
contentPanel.add(header);
|
|
|
|
|
|
|
|
|
|
|
|
contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); // espace
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Ajout du panel d’aperçu
|
|
|
|
|
|
contentPanel.add(imagePreviewPanel);
|
|
|
|
|
|
contentPanel.add(Box.createRigidArea(new Dimension(0, 20)));
|
|
|
|
|
|
// Ajout du panel des fréquences
|
|
|
|
|
|
contentPanel.add(frequencyTablePanel);
|
|
|
|
|
|
contentPanel.add(Box.createRigidArea(new Dimension(0, 20)));
|
|
|
|
|
|
// Ajout panel des codes
|
|
|
|
|
|
contentPanel.add(codeTablePanel);
|
|
|
|
|
|
contentPanel.add(Box.createRigidArea(new Dimension(0, 20)));
|
|
|
|
|
|
// la section du scrollpane
|
|
|
|
|
|
JScrollPane scrollPane = new JScrollPane(contentPanel);
|
|
|
|
|
|
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
|
|
|
|
|
|
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
|
|
|
|
|
scrollPane.getVerticalScrollBar().setUnitIncrement(16); // scroll plus adouci fluide
|
|
|
|
|
|
|
|
|
|
|
|
this.add(scrollPane);
|
|
|
|
|
|
this.setVisible(true); // toi meme tu sais
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Met à jour l’image affichée dans la zone d’aperçu.
|
|
|
|
|
|
*
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
* Cette méthode est appelée lorsque l’image à convertir
|
|
|
|
|
|
* a été chargée. La fenêtre ne modifie pas l’image :
|
|
|
|
|
|
* elle la transmet simplement au panneau d’aperçu.
|
2025-12-19 10:49:27 +01:00
|
|
|
|
* </p>
|
|
|
|
|
|
*
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* @param img image à afficher
|
2025-12-19 10:49:27 +01:00
|
|
|
|
*/
|
2025-12-27 10:20:24 +01:00
|
|
|
|
public void setImagePreview(BufferedImage img) {
|
2025-12-19 10:49:27 +01:00
|
|
|
|
imagePreviewPanel.setImage(img);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* Met à jour l’affichage des tables de fréquences.
|
2025-12-19 10:49:27 +01:00
|
|
|
|
*
|
|
|
|
|
|
* <p>
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* Les fréquences sont déjà calculées avant l’appel
|
|
|
|
|
|
* de cette méthode. La fenêtre se contente de demander
|
|
|
|
|
|
* au panneau dédié de rafraîchir son affichage.
|
2025-12-19 10:49:27 +01:00
|
|
|
|
* </p>
|
|
|
|
|
|
*/
|
2025-12-20 14:56:22 +01:00
|
|
|
|
public void setFrequencyTable(int[] freqR,int[] freqG,int[] freqB) {
|
|
|
|
|
|
frequencyTablePanel.updateFrequencies(freqR,freqG,freqB);
|
2025-12-19 10:49:27 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Met à jour l’affichage des codes Huffman.
|
|
|
|
|
|
*
|
|
|
|
|
|
* <p>
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* Cette méthode ne génère aucun code.
|
|
|
|
|
|
* Elle permet uniquement d’afficher les codes
|
|
|
|
|
|
* qui ont été produits par la partie traitement.
|
2025-12-19 10:49:27 +01:00
|
|
|
|
* </p>
|
|
|
|
|
|
*/
|
2025-12-20 00:30:14 +01:00
|
|
|
|
public void setHuffmanTable(Map<Integer, String> codesRouge,
|
|
|
|
|
|
Map<Integer, String> codesVert,
|
|
|
|
|
|
Map<Integer, String> codesBleu) {
|
2025-12-27 14:19:04 +01:00
|
|
|
|
codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu);
|
2025-12-19 10:49:27 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Met à jour l’affichage des codes canoniques.
|
|
|
|
|
|
*
|
|
|
|
|
|
* <p>
|
2025-12-20 00:30:14 +01:00
|
|
|
|
* Les codes canoniques sont transmis au panneau
|
|
|
|
|
|
* chargé de leur affichage. Aucune vérification
|
|
|
|
|
|
* ni transformation n’est effectuée ici.
|
2025-12-19 10:49:27 +01:00
|
|
|
|
* </p>
|
|
|
|
|
|
*/
|
2025-12-20 00:30:14 +01:00
|
|
|
|
public void setCanonicalTable(Map<Integer, String> codesRouge,
|
|
|
|
|
|
Map<Integer, String> codesVert,
|
|
|
|
|
|
Map<Integer, String> codesBleu) {
|
2025-12-27 14:19:04 +01:00
|
|
|
|
codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu);
|
2025-12-19 10:49:27 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|