package fr.iutfbleau.sae.vconverter; import java.awt.image.BufferedImage; import java.util.Map; import java.awt.*; import javax.swing.*; import fr.iutfbleau.sae.ConverterController; import fr.iutfbleau.sae.ExportButtonListener; /** * Fenêtre principale du convertisseur. * *

* 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). *

* * *

* Elle sert de point d’entrée unique pour la partie graphique *

*/ public class ConverterWindow extends JFrame { private ImagePreviewPanel imagePreviewPanel; private FrequencyTablePanel frequencyTablePanel; private CodeTablePanel codeTablePanel; /** * Crée la fenêtre principale du convertisseur. * *

* Le constructeur initialise la fenêtre et met en place * les différents panneaux graphiques utilisés pour l’affichage. *

*/ public ConverterWindow() { // Configuration de la fenetre this.setTitle("Convertisseur PIF - Visualisation des données"); this.setSize(900, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); // Centre la fenêtre this.setResizable(true); // on autorise le this.setLayout(new BorderLayout()); // 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(5, 5, 5, 5)); // 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, 5))); // espace // Ajout du panel d'aperçu contentPanel.add(imagePreviewPanel); contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // Ajout du panel des fréquences contentPanel.add(frequencyTablePanel); contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // Ajout panel des codes contentPanel.add(codeTablePanel); contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // 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, BorderLayout.CENTER); this.setVisible(true); } /** * Met à jour l’image affichée dans la zone d’aperçu. * *

* 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. *

* * @param img image à afficher */ public void setImagePreview(BufferedImage img) { imagePreviewPanel.setImage(img); } /** * Met à jour l’affichage des tables de fréquences. */ public void setFrequencyTable(int[] freqR,int[] freqG,int[] freqB) { frequencyTablePanel.updateFrequencies(freqR,freqG,freqB); } /** * Met à jour l’affichage des codes Huffman. * *

* Elle permet uniquement d’afficher les codes * qui ont été produits par la partie traitement. *

*/ public void setHuffmanTable(Map codesRouge, Map codesVert, Map codesBleu) { codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu); } /** * Met à jour l’affichage des codes canoniques. * *

* Les codes canoniques sont transmis au panneau * chargé de leur affichage. *

*/ public void setCanonicalTable(Map codesRouge, Map codesVert, Map codesBleu) { codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu); } public void addSaveButton(ConverterController controller) { JButton saveBtn = new JButton("Exporter en .pif"); ExportButtonListener ecouteur =new ExportButtonListener(controller); saveBtn.addActionListener(ecouteur); // panneau du bas JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); bottomPanel.add(saveBtn); // ajoute au bas de la fenêtre this.add(bottomPanel, BorderLayout.SOUTH); // rafraîchir l'affichage this.revalidate(); this.repaint(); } }