package fr.iutfbleau.sae; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Map; import javax.swing.*; /** * Fenêtre principale du convertisseur. * Cette classe affiche l'image chargée, les tables de fréquences, * les codes Huffman et les codes canoniques. * C'est la partie "Vue" de l'application. */ public class ConverterWindow extends JFrame { private ImagePreviewPanel imagePreviewPanel; private FrequencyTablePanel frequencyTablePanel; private CodeTablePanel codeTablePanel; private JPanel bottomPanel; /** * Constructeur de la fenêtre du convertisseur. * Initialise la fenêtre et installe tous les panneaux graphiques. */ public ConverterWindow() { setTitle("Convertisseur PIF - Visualisation des données"); setSize(900, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setResizable(true); setLayout(new BorderLayout()); // Création des panneaux d'affichage imagePreviewPanel = new ImagePreviewPanel(); frequencyTablePanel = new FrequencyTablePanel(); codeTablePanel = new CodeTablePanel(); // Panneau principal avec un scroll JPanel contentPanel = new JPanel(new BorderLayout()); contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JLabel header = new JLabel(" Convertisseur PIF – Visualisation des données "); header.setFont(new Font("SansSerif", Font.BOLD, 18)); header.setHorizontalAlignment(SwingConstants.CENTER); contentPanel.add(header, BorderLayout.NORTH); contentPanel.add(imagePreviewPanel, BorderLayout.CENTER); // Les tables en bas JPanel tablesPanel = new JPanel(); tablesPanel.setLayout(new BoxLayout(tablesPanel, BoxLayout.Y_AXIS)); tablesPanel.add(frequencyTablePanel); tablesPanel.add(Box.createRigidArea(new Dimension(0, 5))); tablesPanel.add(codeTablePanel); contentPanel.add(tablesPanel, BorderLayout.SOUTH); JScrollPane scrollPane = new JScrollPane(contentPanel); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.getVerticalScrollBar().setUnitIncrement(16); add(scrollPane, BorderLayout.CENTER); // Fenêtre visible immédiatement setVisible(true); } /** * Affiche l'image chargée dans le panneau d'aperçu. * @param img l'image à afficher */ public void setImagePreview(BufferedImage img) { imagePreviewPanel.setImage(img); } /** * Met à jour l'affichage des fréquences des trois composantes. */ public void setFrequencyTable(int[] freqR, int[] freqG, int[] freqB) { frequencyTablePanel.updateFrequencies(freqR, freqG, freqB); } /** * Met à jour l'affichage des codes Huffman. */ public void setHuffmanTable(Map r, Map g, Map b) { codeTablePanel.updateCodes(r, g, b); } /** * Met à jour l'affichage des codes canoniques. */ public void setCanonicalTable(Map r, Map g, Map b) { codeTablePanel.updateCanonicalCodes(r, g, b); } /** * Ajoute un bouton permettant d'exporter l'image en .pif. * Le contrôleur est envoyé au listener responsable de la sauvegarde. */ public void addSaveButton(ConverterController controller) { JButton saveBtn = new JButton("Exporter en .pif"); ExportButtonListener listener = new ExportButtonListener(controller); saveBtn.addActionListener(listener); this.bottomPanel = new JPanel(); bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); bottomPanel.add(saveBtn); add(bottomPanel, BorderLayout.SOUTH); revalidate(); repaint(); } /** * Retire le bouton d'export apres la sauvegarde. * Utilise dans le cas ou un chemin de sortie est fourni en argument. */ public void removeSaveButton() { if (bottomPanel != null) { remove(bottomPanel); bottomPanel = null; revalidate(); repaint(); } } }