2010-09-06 17 views
35

Metin dosyalarından veri yükleyen ve kaydeden bir program üzerinde çalışıyorum ve kullanıcıya JFileChooser ile yükleme ve kaydetme hakkında bir dosya adı soruyorum.Onay iletişim kutusuyla JFileChooser

Bu soru tasarrufu iletişim hakkındadır: new JFileChooser().showSaveDialog();. Kullanıcı daha sonra herhangi bir uyarı olmaksızın mevcut bir dosyanın üzerine yazabilir ve bu , numaralı bir sorun olacaktır.

Bunu nasıl düzelteceğinizle ilgili herhangi bir öneriniz var mı? Bir yöntem veya seçenek arıyordum ama hiçbir şey bulamadım.

Şimdiden teşekkürler.

cevap

71

Teşekkürler, ama ben JFileChooser, bu şekilde approveSelection() geçersiz kılma, başka bir çözüm bulundu:

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

Bunun başkası için yararlı olabileceğini umuyoruz.

+0

Yardım ettim! Yaptığın aynı şeyi yaptım ama bir kullanıcı bir seçenek seçtikten sonra iletişim kutusunu kapatmak için sorun yaşadım. "Super.approveSelection()" bana yardımcı oldu. Teşekkürler – prolink007

+0

showSaveDialog için, seçili dosyanın uzantısıyla ilgilenmelisiniz. – onurbaysan

3

Kontrol aynı dosya zaten o kullanıcıdan onay sormak bulunmamakta ise kaydetmeden önce o gerçekten geçersiz kılmak istiyor mu: 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

dosyayı kontrol etmek koddur zaten kullanmakta mevcut

1

Belki de dosyanın zaten mevcut olmadığını doğrulayabilir ve hatta JFileChooser'a bir FileSystemView verin (bkz.). 10) cevapları için

1

Bunu kendi cevabınıza göre yazdım. Birisi başka birinin yararlı bulduğu haberi için:

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

AvrDragon'ın dediği gibi, X ile kapatma işlemi ele alınmamıştır. Tüm alakasız seçenekleri ele almak için varsayılan bir durum ekledim:

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