JFileChooser с диалоговым окном подтверждения - PullRequest
37 голосов
/ 06 сентября 2010

Я работаю над программой, которая загружает и сохраняет данные из текстовых файлов, и я спрашиваю пользователя имя файла с JFileChooser при загрузке и сохранении.

Этот вопрос касается диалогового окна save : new JFileChooser().showSaveDialog();. Затем пользователь может перезаписать существующий файл без предупреждения, и что будет проблемой .

Есть предложения, как это исправить? Я искал какой-то метод или вариант, но ничего не нашел.

Заранее спасибо.

Ответы [ 5 ]

77 голосов
/ 16 сентября 2010

Спасибо за ответы, но я нашел другой обходной путь, переопределяя ApproveSelection () JFileChooser, таким образом:

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();
    }        
}

Я надеюсь, что это может быть полезно для кого-то еще.

4 голосов
/ 15 марта 2012

Как сказал AvrDragon, закрытие с помощью X не обрабатывается.Я добавил случай по умолчанию для обработки всех несущественных опций:

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();
        }
    };
3 голосов
/ 06 сентября 2010

Проверьте перед сохранением, существует ли тот же файл, а затем спросите у пользователя подтверждения, действительно ли она хочет переопределить: 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");
    }  

здесь - это код

Чтобы проверить, что файл уже существует, используйте

boolean exists = (new File("filename")).exists();
if (exists) {
    // File or directory exists
} else {
    // File or directory does not exist
}
1 голос
/ 24 января 2012

Я написал это на основе вашего собственного ответа.Опубликовано в случае, если кто-то найдет это полезным:

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 голос
/ 06 сентября 2010

Возможно, вы могли бы проверить, что файл еще не существует, и даже дать JFileChooser FileSystemView (см. этот конструктор )

...