2012-05-09 2 views
1

Я добавил несколько файлов в свой JList через JFileChooser с помощью vector. Я пытаюсь сделать это систематически, проверяя, доступны ли определенные файлы в JList или нет. Например, если я добавлю файл с именем «abc.xml», я сразу же проверю, существует ли этот файл в JList или нет.дублирование файлов в java

Также я хотел бы проверить, повторяется ли файл только один раз. Если он повторяется несколько раз («abc.xml», «abc.xml», ...), должно появиться сообщение об ошибке, указывающее, что файл добавляется несколько раз.

Я размещаю полный текст здесь;

  public Test() 
{ 
    setTitle("EXAMPLE"); 
    getContentPane().setLayout(new MigLayout("", "[][][][][grow][][][][][][][] 
       [][][grow][grow][][][grow][][][][][][][grow]", "[][][][][][][][grow] 
       [grow][][][][][][][grow][]")); 

    final JFileChooser fileChooser = new JFileChooser(); 
    fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
    fileChooser.setMultiSelectionEnabled(true); 
    getContentPane().add(fileChooser, "cell 0 1 3 16"); 

    JScrollPane scrollPane = new JScrollPane(); 
    getContentPane().add(scrollPane, "cell 23 2 3 15,grow"); 

    vector = new Vector<File>(); 
    final JList list = new JList(vector); 
    scrollPane.setViewportView(list); 


    JButton btnNewButton = new JButton(" Add   "); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      for (File file : fileChooser.getSelectedFiles()) { 
         vector.addElement(file); 
       } 
       //System.out.println("Added..!!"); 
       list.updateUI(); 

      } 
    }); 
    getContentPane().add(btnNewButton, "cell 4 0"); 



    JButton btnNewButton_1 = new JButton(" Remove "); 
    btnNewButton_1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if(list.getSelectedIndices().length > 0) { 
        int[] selectedIndices = list.getSelectedIndices(); 
        for (int i = selectedIndices.length-1; i >=0; i--) { 
         vector.removeElementAt(i); 
        } 
        } 
        //System.out.println("Removed..!!"); 
        list.updateUI(); 

     } 
     }); 
    getContentPane().add(btnNewButton_1, "cell 4 2"); 

    JButton btnNewButton_2 = new JButton(" Check  "); 
    btnNewButton_2.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

      ***File file = fileChooser.getSelectedFile(); 
      boolean found = false; 
      for (File f : vector) { 
       if (file.getName().equals(f.getName())) { 
        found = true; 
        break; 
       } 
      } 
      if (!found) { 
       vector.add(file); 
       fireIntervalAdded(this, vector.size()-1, vector.size()-1); 
      } else { 
       // Abusive usage of an exception 
       JOptionPane.showMessageDialog(null, "File " + file.getName() + " 
       already added"); 

      }*** 
     }); 

      public static void main(String args[]) {   
      // Create an instance of the test application   
      Test mainFrame = new Test();   
      mainFrame.pack();   
      mainFrame.setVisible(true);  
    } 

Что я понимаю - это поле с сообщением о том, что файл уже добавлен, даже когда файл встречается только один раз.

Что я ожидаю, когда файл добавляется один раз, он ничего не должен отображать. Но когда он добавляется несколько раз, только тогда он должен отображать сообщение, что файл уже добавлен.

Может ли кто-нибудь помочь?

+3

aaaaah! (форматирование кода) ужас! – andersoj

+0

Код не выглядит совсем рядом с тем, что вы хотите сделать? Можете ли вы отформатировать его для удобства чтения? – maress

+0

Вы хотите, чтобы я опубликовал весь код? если так, я могу это сделать. – dmurali

ответ

0
vector.contains(fileName) 

начните с первой?

3

ОК, Вот пример того, что вы описываете. Я не совсем уверен, что является условием отказа от добавления файла. Это основано на имени, но мне интересно, если вы не ищете File.equals(), используя первый getCanonicalFile(). Я показал это и в комментарии в коде.

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.util.Vector; 

import javax.swing.AbstractListModel; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

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

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 

    public static class MyListModel extends AbstractListModel { 

     private Vector<File> files = new Vector<File>(); 

     public void addFilesToModel(File[] f) { 
      for (File file : f) { 
       addFileToModel(file); 
      } 
     } 

     public void addFileToModel(File file) throws IllegalArgumentException { 
      boolean found = false; 
      // file = file.getCanonicalFile(); 
      for (File file2 : files) { 
       // file2.getCanonicalFile().equals(file) + throw IOException 
       if (file2.getName().equals(file.getName())) { 
        found = true; 
        break; 
       } 
      } 
      if (!found) { 
       files.add(file); 
       fireIntervalAdded(this, files.size() - 1, files.size() - 1); 
      } else { 
       // Abusive usage of an exception 
       throw new IllegalArgumentException("File " + file.getName() + " already added"); 
      } 
     } 

     @Override 
     public int getSize() { 
      return files.size(); 
     } 

     @Override 
     public Object getElementAt(int index) { 
      return files.get(index); 
     } 

    } 

    private static File lastFolder; 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     final MyListModel model = new MyListModel(); 
     JList list = new JList(model); 
     final JButton button = new JButton("Add files..."); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JFileChooser chooser = new JFileChooser(); 
       if (lastFolder != null) { 
        chooser.setCurrentDirectory(lastFolder); 
       } 
       chooser.setMultiSelectionEnabled(true); 
       chooser.showDialog(button, "Add files"); 
       if (chooser.getSelectedFiles() != null) { 
        for (File file : chooser.getSelectedFiles()) { 
         try { 
          model.addFileToModel(file); 
         } catch (IllegalArgumentException e1) { 
          JOptionPane.showMessageDialog(button, e1.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); 
         } 
        } 
        lastFolder = chooser.getCurrentDirectory(); 
       } 
      } 
     }); 
     panel.add(new JScrollPane(list)); 
     panel.add(button); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

EDIT


Помимо того, что ваш код был неполным, мне удалось организовать его и заставить его работать, но это очень далеко от совершенства. Я также избавился от MigLayout, потому что для этого требуется дополнительная библиотека. Не стесняйтесь возвращать его.

import java.awt.Component; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.util.Vector; 

import javax.swing.AbstractListModel; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class Test extends JFrame { 

    Vector<File> vector; 
    JPanel root; 
    private MyListModel model; 

    public class MyListModel extends AbstractListModel { 

     public void addFilesToModel(File[] f) { 
      for (File file : f) { 
       addFileToModel(file); 
      } 
     } 

     public void addFileToModel(File file) throws IllegalArgumentException { 
      boolean found = false; 
      // file = file.getCanonicalFile(); 
      for (File file2 : vector) { 
       // file2.getCanonicalFile().equals(file) + throw IOException 
       if (file2.getName().equals(file.getName())) { 
        found = true; 
        break; 
       } 
      } 
      if (!found) { 
       vector.add(file); 
       fireIntervalAdded(this, vector.size() - 1, vector.size() - 1); 
      } else { 
       // Abusive usage of an exception 
       throw new IllegalArgumentException("File " + file.getName() + " already added"); 
      } 
     } 

     public void removeFileFromModel(File file) throws IllegalArgumentException { 
      int index = vector.indexOf(file); 
      File removed = vector.remove(index); 
      if (removed != null) { 
       fireIntervalRemoved(this, index, index); 
      } else { 
       // Nothing was removed 
      } 
     } 

     public void removeFilesFromModel(File[] files) { 
      for (File f : files) { 
       removeFileFromModel(f); 
      } 
     } 

     @Override 
     public int getSize() { 
      return vector.size(); 
     } 

     @Override 
     public Object getElementAt(int index) { 
      return vector.get(index); 
     } 

    } 

    public Test() { 
     super("EXAMPLE"); 
     root = new JPanel(new GridBagLayout()); 
     vector = new Vector<File>(); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridheight = 2; 
     getContentPane().add(root); 
     final JFileChooser fileChooser = new JFileChooser(); 
     fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
     fileChooser.setMultiSelectionEnabled(true); 
     root.add(fileChooser, gbc); 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.ipadx = 5; 
     gbc.ipady = 5; 
     gbc.gridheight = 1; 
     gbc.gridwidth = 3; 
     gbc.gridx = 1; 

     vector = new Vector<File>(); 
     model = new MyListModel(); 
     final JList list = new JList(model); 
     JScrollPane scrollPane = new JScrollPane(list); 
     root.add(scrollPane, gbc); 
     gbc.gridwidth = 1; 
     gbc.weightx = 0; 
     gbc.weighty = 0; 
     gbc.anchor = GridBagConstraints.CENTER; 
     final JButton btnNewButton = new JButton("Add"); 
     btnNewButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       for (File file : fileChooser.getSelectedFiles()) { 
        try { 
         model.addFileToModel(file); 
        } catch (IllegalArgumentException e1) { 
         showError(btnNewButton, file); 
        } 
       } 
      } 
     }); 
     gbc.gridy = 1; 
     root.add(btnNewButton, gbc); 

     JButton btnNewButton_1 = new JButton("Remove"); 
     btnNewButton_1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (list.getSelectedIndices().length > 0) { 
        for (Object file : list.getSelectedValues()) { 
         model.removeFileFromModel((File) file); 
        } 
       } 
      } 
     }); 
     gbc.gridx++; 
     root.add(btnNewButton_1, gbc); 

     final JButton btnNewButton_2 = new JButton("Check"); 
     btnNewButton_2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 

       File file = fileChooser.getSelectedFile(); 
       boolean found = false; 
       for (File f : vector) { 
        if (file.getName().equals(f.getName())) { 
         found = true; 
         break; 
        } 
       } 
       if (found) { 
        showError(btnNewButton_2, file); 
       } else { 
        JOptionPane.showMessageDialog(btnNewButton_2, "File " + file.getAbsolutePath() + " is not in the list yet"); 
       } 
      } 

     }); 
     gbc.gridx++; 
     root.add(btnNewButton_2, gbc); 
    } 

    private void showError(Component parent, File file) { 
     JOptionPane.showMessageDialog(parent, "File " + file.getName() + " already added"); 
    } 

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

      @Override 
      public void run() { 
       Test mainFrame = new Test(); 
       mainFrame.pack(); 
       mainFrame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

Большое спасибо за ваш пример. Но теперь я изменил свой код, чтобы показать, что я дал и что получаю. Было бы здорово, если бы вы могли помочь. – dmurali

+0

@dmurali 1) Вы никогда ничего не делаете с результатом этой строки 'boolean abcExists = vector.contains (file);' 2) Почему вы продолжаете жесткое кодирование «abc.txt»? Я понял, что вы хотите добавить файлы в список, но просто убедитесь, что он не добавлен дважды. Ваш код предотвращает добавление какого-либо файла с именем «abc.txt». 3) Вы хотите сравнивать файлы только по их имени, или же можно добавить 'C: \ tmp.log' и' C: \ foo \ tmp.log'? –

+0

Я хотел бы сравнить файлы, просто используя их имена. например, C: \ tmp.log = C: \ foo \ tmp.log, так как файл все тот же – dmurali

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