mis a jour selon ma comprehenssion

This commit is contained in:
AlgaLaptop
2026-01-07 20:30:37 +01:00
parent 8c6dcec3df
commit 0291e9b0dd
5 changed files with 103 additions and 26 deletions
+58 -22
View File
@@ -3,7 +3,6 @@ import fr.iutfbleau.sae.mhuffman.*;
import fr.iutfbleau.sae.mpif.PIFWriter;
import fr.iutfbleau.sae.mpif.Pixel;
import fr.iutfbleau.sae.mpif.RGBImage;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
@@ -185,30 +184,74 @@ public class ConverterController {
/**
* Gere la sauvegarde via le bouton de l'interface.
* Si un chemin de sortie est defini, sauvegarde directement.
* Si un chemin de sortie est defini, sauvegarde directement vers ce chemin.
* Sinon, ouvre un selecteur de fichier pour que l'utilisateur choisisse
* l'emplacement de sauvegarde.
* La sauvegarde est effectuee dans un thread separe pour ne pas bloquer
* l'interface graphique.
*/
public void saveViaBtn() {
if (outputPath != null) {
saveAsPIF(outputPath);
GestionErreur.afficherInfo("Fichier sauvegarde avec succes. Chemin : " + outputPath);
return;
}
File fichierSortie;
// pas de chemin fourni, ouvrir JFileChooser
if (outputPath == null) {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Enregistrer le fichier .pif");
// Sinon JFileChooser
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Enregistrer le fichier .pif");
if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
File fichierSelectionne = chooser.getSelectedFile();
ThreadSauvegardePIF thread = new ThreadSauvegardePIF(this, fichierSelectionne);
if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
fichierSortie = chooser.getSelectedFile();
// Verifier et corriger l'extension
fichierSortie = verifierExtensionPIF(fichierSortie);
ThreadSauvegardePIF thread = new ThreadSauvegardePIF(this, fichierSortie);
thread.start();
}
}
// chemin fourni, sauvegarder directement
else {
fichierSortie = new File(outputPath);
// Verifier et corriger l'extension
fichierSortie = verifierExtensionPIF(fichierSortie);
ThreadSauvegardePIF thread = new ThreadSauvegardePIF(this, fichierSortie);
thread.start();
// Je retire le bouton apres le clic
fen.removeSaveButton();
}
}
/**
* Verifie et corrige l'extension du fichier pour qu'elle soit .pif en minuscules.
* Si le fichier a une extension .PIF en majuscules, elle est remplacee.
* Si le fichier n'a pas d'extension .pif, elle est ajoutee.
*
* @param fichier le fichier a verifier
* @return le fichier avec l'extension .pif correcte
*/
private File verifierExtensionPIF(File fichier) {
String chemin = fichier.getAbsolutePath();
String cheminMinuscule = chemin.toLowerCase();
// Si le fichier se termine par .pif (en minuscules), OK
if (chemin.endsWith(".pif")) {
return fichier;
}
// Si le fichier se termine par .PIF, .Pif, etc., remplacer par .pif
if (cheminMinuscule.endsWith(".pif")) {
// Enlever les 4 derniers caracteres (.PIF, .Pif, etc.)
chemin = chemin.substring(0, chemin.length() - 4);
// Ajouter .pif en minuscules
return new File(chemin + ".pif");
}
// Sinon, ajouter .pif
return new File(chemin + ".pif");
}
/**
* Lance le processus complet de conversion d'une image au format PIF.
* Etapes :
@@ -247,14 +290,7 @@ public class ConverterController {
computeHuffman();
computeCanonical();
// Sauvegarder : si un second argument est donne, sauvegarde automatique
if (this.outputPath != null) {
this.saveAsPIF(this.outputPath);
GestionErreur.afficherInfo("Fichier sauvegarde automatiquement : " + this.outputPath);
} else {
// Pas de deuxieme argument : ajouter un bouton pour choisir avec un JFileChooser
fen.addSaveButton(this);
}
fen.addSaveButton(this);
}
/**
+15 -1
View File
@@ -16,6 +16,7 @@ public class ConverterWindow extends JFrame {
private ImagePreviewPanel imagePreviewPanel;
private FrequencyTablePanel frequencyTablePanel;
private CodeTablePanel codeTablePanel;
private JPanel bottomPanel;
/**
* Constructeur de la fenêtre du convertisseur.
@@ -109,7 +110,7 @@ public class ConverterWindow extends JFrame {
ExportButtonListener listener = new ExportButtonListener(controller);
saveBtn.addActionListener(listener);
JPanel bottomPanel = new JPanel();
this.bottomPanel = new JPanel();
bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
bottomPanel.add(saveBtn);
@@ -118,4 +119,17 @@ public class ConverterWindow extends JFrame {
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();
}
}
}
+30 -3
View File
@@ -1,15 +1,19 @@
package fr.iutfbleau.sae;
import java.awt.BorderLayout;
import java.io.File;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
/**
* Thread pour sauvegarder un fichier PIF en arriere-plan.
* Permet d'eviter de bloquer l'interface graphique pendant la sauvegarde.
* Affiche un dialogue de progression pendant la sauvegarde.
*/
public class ThreadSauvegardePIF extends Thread {
private final ConverterController controleur;
private final File fichier;
private ConverterController controleur;
private File fichier;
/**
* Construit un nouveau thread de sauvegarde.
@@ -24,13 +28,36 @@ public class ThreadSauvegardePIF extends Thread {
/**
* Execute la sauvegarde du fichier PIF.
* Affiche un dialogue de progression pendant la sauvegarde.
*/
@Override
public void run() {
// Creer le dialogue de progression
JDialog dialogue = new JDialog();
dialogue.setTitle("Sauvegarde");
dialogue.setModal(false);
dialogue.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dialogue.setSize(300, 100);
dialogue.setLocationRelativeTo(null);
dialogue.setLayout(new BorderLayout(10, 10));
JLabel label = new JLabel("Sauvegarde en cours...", JLabel.CENTER);
dialogue.add(label, BorderLayout.CENTER);
JProgressBar barre = new JProgressBar();
barre.setIndeterminate(true);
dialogue.add(barre, BorderLayout.SOUTH);
dialogue.setVisible(true);
try {
// Sauvegarder le fichier
controleur.saveAsPIF(fichier.getAbsolutePath());
dialogue.dispose();
GestionErreur.afficherInfo("Fichier sauvegarde avec succes : " + fichier.getName());
} catch (Exception e) {
dialogue.dispose();
GestionErreur.afficherErreur("Erreur lors de la sauvegarde : " + e.getMessage());
}
}