2010-09-06 10 views
35

Pracuję nad programem, który ładuje i zapisuje dane z plików tekstowych, a ja pytam użytkownika o nazwę pliku z JFileChooser przy ładowaniu i zapisywaniu.JFileChooser z dialogiem potwierdzającym

To pytanie dotyczy okna dialogowego zapisywania: new JFileChooser().showSaveDialog();. Użytkownik może wtedy zastąpić istniejący plik bez żadnego ostrzeżenia, i że byłby problem.

Wszelkie sugestie, jak to naprawić? Szukałem jakiejś metody lub opcji, ale niczego nie znalazłem.

Z góry dziękuję.

Odpowiedz

71

Dzięki za odpowiedzi, ale znalazłem inny obejścia przesłanianie approveSelection() z JFileChooser, w ten sposób:

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

Mam nadzieję, że może to być przydatne dla kogoś innego.

+0

Pomógł mi! Zrobiłem to samo, co robiłem, ale miałem problem z zamknięciem okna dialogowego po wybraniu przez użytkownika opcji. "Super.approveSelection()" pomogło mi. Dzięki – prolink007

+0

Dla showSaveDialog powinieneś obsłużyć wybrane rozszerzenie pliku. – onurbaysan

3

Sprawdź przed zapisaniem jeśli ten sam plik już istnieją następnie poprosić użytkownika o potwierdzenie czy ona naprawdę chce zastąpić: 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"); 
    } 

here jest kod

Aby sprawdzić plik już istnieje używać

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

Napisałem to na podstawie własnej odpowiedzi. Opublikowany w przypadku, gdy ktoś inny uzna to za przydatne:

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

Jak powiedział AvrDragon, zamknięcie za pomocą X nie jest obsługiwane. Dodałem domyślną skrzynkę do obsługi wszystkich nieistotnych opcji:

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(); 
     } 
    }; 
Powiązane problemy