web-dev-qa-db-fra.com

JFileChooser avec boîte de dialogue de confirmation

Je travaille sur un programme qui charge et enregistre des données à partir de fichiers texte, et je demande à l'utilisateur un nom de fichier avec JFileChooser lors du chargement et de l'enregistrement.

Cette question concerne la boîte de dialogue enregistrer: new JFileChooser().showSaveDialog();. L'utilisateur pourrait alors écraser un fichier existant sans aucun avertissement, et cela serait un problème.

Une suggestion sur la façon de résoudre ce problème? Je cherchais une méthode ou une option, mais je n'ai rien trouvé.

Merci d'avance.

39

Merci pour les réponses, mais j'ai trouvé une autre solution de contournement, remplaçant l'approveSelection () du JFileChooser, de cette façon:

JFileChooser example = new JFileChooser(){
    @Override
    public void approveSelection(){
        File f = getSelectedFile();
        if(f.exists() && getDialogType() == SAVE_DIALOG){
            int result = JOptionPane.showConfirmDialog(this,"The file exists, overwrite?","Existing file",JOptionPane.YES_NO_CANCEL_OPTION);
            switch(result){
                case JOptionPane.YES_OPTION:
                    super.approveSelection();
                    return;
                case JOptionPane.NO_OPTION:
                    return;
                case JOptionPane.CLOSED_OPTION:
                    return;
                case JOptionPane.CANCEL_OPTION:
                    cancelSelection();
                    return;
            }
        }
        super.approveSelection();
    }        
}

J'espère que cela pourrait être utile à quelqu'un d'autre.

79
Roberto Luis Bisbé

Comme l'a dit AvrDragon, la fermeture avec X n'est pas gérée. J'ai ajouté un cas par défaut pour gérer toutes les options non pertinentes:

final JFileChooser fc = new JFileChooser() {

        private static final long serialVersionUID = 7919427933588163126L;

        public void approveSelection() {
            File f = getSelectedFile();
            if (f.exists() && getDialogType() == SAVE_DIALOG) {
                int result = JOptionPane.showConfirmDialog(this,
                        "The file exists, overwrite?", "Existing file",
                        JOptionPane.YES_NO_CANCEL_OPTION);
                switch (result) {
                case JOptionPane.YES_OPTION:
                    super.approveSelection();
                    return;
                case JOptionPane.CANCEL_OPTION:
                    cancelSelection();
                    return;
                default:
                    return;
                }
            }
            super.approveSelection();
        }
    };
5
kmindi

Vérifiez avant d'enregistrer si le même fichier existe déjà, puis demandez à l'utilisateur de confirmer s'il souhaite vraiment remplacer: p

 JDialog.setDefaultLookAndFeelDecorated(true);
    int response = JOptionPane.showConfirmDialog(null, "Are you sure you want to override existing file?", "Confirm",
        JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
    if (response == JOptionPane.NO_OPTION) {
      System.out.println("No button clicked");
    } else if (response == JOptionPane.YES_OPTION) {
      System.out.println("Yes button clicked");
    } else if (response == JOptionPane.CLOSED_OPTION) {
      System.out.println("JOptionPane closed");
    }  

ici est le code

Pour vérifier que le fichier existe déjà, utilisez

boolean exists = (new File("filename")).exists();
if (exists) {
    // File or directory exists
} else {
    // File or directory does not exist
}
3
Jigar Joshi

J'ai écrit cela sur la base de votre propre réponse. Publié au cas où quelqu'un d'autre le trouverait utile:

final JFileChooser exportFileChooser = new JFileChooser();
exportFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
exportFileChooser.setApproveButtonText("Export");

final JButton exportButton = new JButton("Export text file");
exportButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        int returnVal = exportFileChooser.showSaveDialog(exportButton
                .getParent());

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File outputFile = exportFileChooser.getSelectedFile();
            if (outputFileIsValid(outputFile)) {
                exportFile(outputFile);
            }
        }
    }

    private boolean outputFileIsValid(File outputFile) {
        boolean fileIsValid = false;
        if (outputFile.exists()) {
            int result = JOptionPane.showConfirmDialog(
                    exportButton.getParent(),
                    "File exists, overwrite?", "File exists",
                    JOptionPane.YES_NO_CANCEL_OPTION);
            switch (result) {
            case JOptionPane.YES_OPTION:
                fileIsValid = true;
                break;
            default:
                fileIsValid = false;
            }
        } else {
            fileIsValid = true;
        }
        return fileIsValid;
    }
});
1
matt burns

Peut-être pourriez-vous vérifier que le fichier n'existe pas déjà, et même donner au JFileChooser un FileSystemView (voir ce constructeur )

1
Riduidel