import java.awt.EventQueue; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.text.Collator; import java.util.Comparator; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.filechooser.FileView; public class FileViewTest { public static void main(String[] args) throws Exception { //UIManager.setLookAndFeel(new ....LookAndFeel()); final JFileChooser jfc = new JFileChooser(); jfc.addPropertyChangeListener(new PropertyChangeListener() { Icon ICON = new ImageIcon(FileViewTest.class.getResource("javax/swing/plaf/metal/icons/ocean/hardDrive.gif")); public void propertyChange(PropertyChangeEvent evt) { if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(evt.getPropertyName())) { final File dir = jfc.getCurrentDirectory(); if (dir == null) { return; } new Thread() { @Override public void run() { File[] kids = dir.listFiles(); if (kids == null) { return; } SortedSet sortedKids = new TreeSet(new Comparator() { Collator COLL = Collator.getInstance(); public int compare(File f1, File f2) { if (f1.isDirectory()) { if (f2.isDirectory()) { return COLL.compare(f1.getName(), f2.getName()); } else { return -1; } } else { if (f2.isDirectory()) { return 1; } else { return COLL.compare(f1.getName(), f2.getName()); } } } }); for (File kid : kids) { if (!kid.isHidden()) { sortedKids.add(kid); } } //System.err.println("starting in " + dir + " with " + sortedKids.size() + " children"); final boolean [] halt = {false}; for (final File kid : sortedKids) { if (halt[0]) { return; } try { Thread.sleep(1000); } catch (InterruptedException x) {} final Set badged = sortedKids.headSet(kid); EventQueue.invokeLater(new Runnable() { public void run() { if (!dir.equals(jfc.getCurrentDirectory())) { halt[0] = true; return; } //System.err.println("doing: " + kid.getName()); jfc.setFileView(new FileView() { @Override public Icon getIcon(File f) { if (f.equals(kid) || badged.contains(f)) { return ICON; } else { return null; } } }); jfc.repaint(); } }); } } }.start(); } } }); EventQueue.invokeLater(new Runnable() { public void run() { jfc.showOpenDialog(null); System.exit(0); } }); } }