import java.awt.Component;
import java.io.*;

import javax.swing.*;
import javax.swing.filechooser.FileView;
import javax.swing.plaf.basic.BasicFileChooserUI;

public class FileListModel extends AbstractListModel {

  public FileListModel(File directory) {
    files=directory.listFiles();
  }
  
  public int getSize() {
    return files.length;
  }

  public Object getElementAt(int index) {
    return files[index];
  }
  
  private final File[] files;
  
  private static FileView createFileView() {
    JFileChooser chooser=new JFileChooser();
    BasicFileChooserUI ui=(BasicFileChooserUI)chooser.getUI();
    return ui.getFileView(chooser);
  }
  
  public static void main(String[] args) {
    
    File dir;
    if (args.length>0)
      dir=new File(args[0]);
    else
      dir=new File(".");
    
    final ListModel model=new FileListModel(dir);
    
    final FileView fileView=createFileView();
    
    JList list=new JList(model);
    list.setLayoutOrientation(JList.VERTICAL_WRAP);
    list.setFixedCellWidth(100);
    
    list.setCellRenderer(new DefaultListCellRenderer() {
      public Component getListCellRendererComponent(JList list,
        Object value,int index,boolean isSelected,boolean cellHasFocus) {
        
        JLabel label=(JLabel)super.getListCellRendererComponent(
          list,value,index,isSelected,cellHasFocus);
        
        File file=(File)value;
        label.setText(file.getName());
        label.setIcon(fileView.getIcon(file));
        label.setToolTipText(fileView.getDescription(file));
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.BOTTOM);
        label.setHorizontalAlignment(JLabel.HORIZONTAL);
        return label;
      }
    });
    
    
    JScrollPane pane=new JScrollPane(list);
    
    final JFrame frame=new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(pane);
    frame.setSize(400,300);
    frame.show();
  }
}