2013-07-12 2 views
1

Как я могу удалить файл в JFileChooser? Я знаю, что AWT с момента написания на родной может иметь возможность удалить из него файл с помощью простой кнопки Delete.Как удалить файл через JFileChooser?

Но что, если бы я хотел был бы удалить файл в JFileChooser? Когда я пытаюсь удалить, у меня есть исключение, к которому обращается файл другой программой и, следовательно, не может быть удален.

Два вопроса, которые я хотел бы спросить в этой ситуации ..

Вопросы

  1. Есть ли взломать удалить файл через JFileChooser?
  2. Почему я не получаю Файл обрабатывается другой программой, когда я удаляю FileDialog. Это потому, что написано в собственном коде?

Любая помощь приветствуется. Заранее спасибо.

+1

'Когда я пытаюсь удалить, у меня есть исключение' - Как вы это делаете? FileChooser не поддерживает функции удаления, поэтому вы должны написать собственный код. Таким образом, ваш код будет неправильным. Отправьте свой [SSCCE] (http://sscce.org/), который демонстрирует проблему. – camickr

+0

Я просто обновляю свой пост. ;) Благодаря. Я был просто занят душем! – user12458

+0

Я получил его sir @camickr Но я просто вижу, почему я не получил его раньше. – user12458

ответ

0

Зачем вам удаляться файл из списка?

Используйте jfilechooser, чтобы получить имя файла и хранилища местоположений как переменную. Закройте файл jfilechooser. Затем удалите файл.

import java.io.File; 

public class DeleteFileExample 
{ 
public static void main(String[] args) 
{ 
    try{ 

     File file = new File("c:\\logfile20100131.log"); 

     if(file.delete()){ 
      System.out.println(file.getName() + " is deleted!"); 
     }else{ 
      System.out.println("Delete operation is failed."); 
     } 

    }catch(Exception e){ 

     e.printStackTrace(); 

    } 

} 
} 

Кроме того, я нашел этот код, который может оказаться полезным, если вы хотите, чтобы функциональность, чтобы быть в самой JFileChooser. От Here. Для этого вам также понадобится This. Swing file

import darrylbu.util.SwingUtils; 
import java.awt.Container; 
import java.awt.Point; 
import java.awt.event.*; 
import javax.swing.*; 

public class FileChooserDeleteMenu { 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
     new FileChooserDeleteMenu().makeUI(); 
     } 
    }); 
    } 

    public void makeUI() { 
    final JFileChooser chooser = new JFileChooser(); 
    final JList list = SwingUtils.getDescendantOfType(JList.class, chooser, "Enabled", true); 
    JPopupMenu popup = list.getComponentPopupMenu(); 
    JMenuItem item = new JMenuItem("Delete"); 
    item.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     if (chooser.getSelectedFile() != null) { 
      JOptionPane.showConfirmDialog(chooser, 
        "Delete " + chooser.getSelectedFile().getAbsolutePath() + "?", 
        "Confirm delete", 
        JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE); 
     } 
     } 
    }); 
     popup.add(item); 

    final MouseListener listener = new MouseAdapter() { 

     @Override 
     public void mousePressed(MouseEvent e) { 
     Point p = e.getPoint(); 
     if (e.getSource() == list) { 
      list.setSelectedIndex(list.locationToIndex(p)); 
     } else { 
      JTable table = (JTable) e.getSource(); 
      if (table.columnAtPoint(p) == 0) { 
      int row = table.rowAtPoint(p); 
      table.getSelectionModel().setSelectionInterval(row, row); 
      } 
     } 
     } 
    }; 
    list.addMouseListener(listener); 

    final Container filePane =  SwingUtilities.getAncestorOfClass(sun.swing.FilePane.class, list); 

    filePane.addContainerListener(new ContainerAdapter() { 

     @Override 
     public void componentAdded(ContainerEvent e) { 
     JTable table = SwingUtils.getDescendantOfType(JTable.class, chooser, "Enabled",  true); 
     if (table != null) { 
      for (MouseListener l : table.getMouseListeners()) { 
      if (l == listener) { 
       return; 
      } 
      } 
      table.addMouseListener(listener); 
     } 
     } 
    }); 
    chooser.showOpenDialog(null); 
    System.exit(0); 
    } 
} 
+0

Поскольку, например, из собственного набора файлов Windows можно создавать или удалять файлы. По крайней мере, это то, что я получаю от вопроса ОП. – Laf

2

Да! Я понял! Я даже обновил JFileChooser после того, как файл был удален.

Обновлено

Добавлена ​​функциональность для удаления нескольких файлов и изменять jf.getUI().rescanCurrentDirectory(jf) для jf.rescanCurrentDirectory() и удалить лишние PropertyChangeListener согласно предложению сэра Роба Camick в.

/* 
* @see http://stackoverflow.com/a/17622050/2534090 
* @author Gowtham Gutha 
*/ 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.beans.*; 
import java.io.*; 
class DeleteThroughJFileChooser extends JFrame 
{ 
JButton jb; 
JFileChooser jf; 
File[] selectedFiles; 
    public DeleteThroughJFileChooser() 
    { 
     // Create and show GUI 
     createAndShowGUI(); 
    } 

    private void createAndShowGUI() 
    { 
     // Set frame properties 
     setTitle("Delete through JFileChooser"); 
     setLayout(new FlowLayout()); 
     setSize(400,400); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     // Create JFileChooser 
     jf=new JFileChooser(); 

     // Allow multiple selection 
     jf.setMultiSelectionEnabled(true); 

     // Create JButton 
     jb=new JButton("Open JFileChooser"); 

     // Add ActionListener to it 
     jb.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae) 
      { 
       // Show the file chooser 
       showFileChooser(); 
      } 
     }); 

     // Register the delete action 
     registerDelAction(); 

     // Add JButton jb to JFrame 
     add(jb); 
    } 

    private void showFileChooser() 
    { 
     // Show the open dialog 
     int op=jf.showOpenDialog(this); 
    } 

    private void registerDelAction() 
    { 
     // Create AbstractAction 
     // It is an implementation of javax.swing.Action 
     AbstractAction a=new AbstractAction(){ 

      // Write the handler 
      public void actionPerformed(ActionEvent ae) 
      { 
       JFileChooser jf=(JFileChooser)ae.getSource(); 
       try 
       { 

       // Get the selected files 
       selectedFiles=jf.getSelectedFiles(); 

        // If some file is selected 
        if(selectedFiles!=null) 
        { 
         // If user confirms to delete 
         if(askConfirm()==JOptionPane.YES_OPTION) 
         { 

         // Call Files.delete(), if any problem occurs 
         // the exception can be printed, it can be 
         // analysed 
         for(File f:selectedFiles) 
         java.nio.file.Files.delete(f.toPath()); 

         // Rescan the directory after deletion 
         jf.rescanCurrentDirectory(); 
         } 
        } 
       }catch(Exception e){ 
        System.out.println(e); 
       } 
      } 
     }; 

     // Get action map and map, "delAction" with a 
     jf.getActionMap().put("delAction",a); 

     // Get input map when jf is in focused window and put a keystroke DELETE 
     // associate the key stroke (DELETE) (here) with "delAction" 
     jf.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("DELETE"),"delAction"); 
    } 

    public int askConfirm() 
    { 
     // Ask the user whether he/she wants to confirm deleting 
     // Return the option chosen by the user either YES/NO 
     return JOptionPane.showConfirmDialog(this,"Are you sure want to delete this file?","Confirm",JOptionPane.YES_NO_OPTION); 
    } 

    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() 
      { 
       new DeleteThroughJFileChooser(); 
      } 
     }); 
    } 
} 
+0

+1, для публикации решения. – camickr

+0

Спасибо, сэр! :) – user12458

+1

Только что заметил, что вам не нужно PropertyChangeListener. В действии удаления вы можете использовать метод getSource() 'ActionEvent' для доступа к' JFileChooser'. Затем вы можете использовать метод 'getSelectedFile()'. – camickr

0

Это как добавить удаление ключа слушателя в JFileChooser:

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.io.File; 
import java.nio.file.Files; 

public class JFileChooserUtilities 
{ 
    public static void registerDeleteAction(JFileChooser fileChooser) 
    { 
     AbstractAction abstractAction = new AbstractAction() 
     { 
      public void actionPerformed(ActionEvent actionEvent) 
      { 
       JFileChooser jFileChooser = (JFileChooser) actionEvent.getSource(); 

       try 
       { 
        File selectedFile = jFileChooser.getSelectedFile(); 

        if (selectedFile != null) 
        { 
         int selectedAnswer = JOptionPane.showConfirmDialog(null, "Are you sure want to permanently delete this file?", "Confirm", JOptionPane.YES_NO_OPTION); 

         if (selectedAnswer == JOptionPane.YES_OPTION) 
         { 
          Files.delete(selectedFile.toPath()); 
          jFileChooser.rescanCurrentDirectory(); 
         } 
        } 
       } catch (Exception exception) 
       { 
        exception.printStackTrace(); 
       } 
      } 
     }; 

     fileChooser.getActionMap().put("delAction", abstractAction); 

     fileChooser.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("DELETE"), "delAction"); 
    } 
} 

код адаптирован из ответа JavaTechnical «s.

Смежные вопросы