import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Date;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.AbstractTableModel;

public class MyTableModel2 extends AbstractTableModel {

  public void setDirectory(File directory) {
    this.directory=directory;
    files=directory.listFiles();
    fireTableDataChanged();
  }
  
  public File getDirectory() {
    return directory;
  }

  public int getColumnCount() {
    return 3;
  }

  public int getRowCount() {
    return files.length;
  }
  
  public String getColumnName(int column) {
    return columnNames[column];
  }

  public Object getValueAt(int row, int column) {
    File file=files[row];
    switch(column) {
      case 0:
        return file.getName();
      case 1:
        return new Long(file.length());
      case 2:
        return new Date(file.lastModified());
    }
    throw new IllegalArgumentException("invalid row or column ("+row+','+column+')');
  }
  
  private File directory;
  private File[] files;
  private final static String[] columnNames={
    "Name","Length","Last modification"
  };
  
  public static void main(String[] args) {
    final MyTableModel2 model=new MyTableModel2();
    
    final JFrame frame=new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    final JTextField dirName=new JTextField();
    model.addTableModelListener(new TableModelListener() {
      public void tableChanged(TableModelEvent e) {
        dirName.setText(model.getDirectory().getAbsolutePath());
      }
    });
    
    model.setDirectory(new File("."));
    
    JTable table=new JTable(model);
    JScrollPane pane=new JScrollPane(table);
    
    final JFileChooser chooser = new JFileChooser();
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    
    JButton changeDir=new JButton("Change Directory ...");
    changeDir.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        
        // workaround Bug Id 4869950
        try {
          chooser.setCurrentDirectory(model.getDirectory().getCanonicalFile());
        } catch (IOException e) {
          e.printStackTrace();
        }
        
        if (chooser.showOpenDialog(frame)== JFileChooser.APPROVE_OPTION) {
          model.setDirectory(chooser.getSelectedFile());
        }
      }
    });
    
    JPanel panel=new JPanel();
    panel.add(dirName);
    panel.add(changeDir);
    
    Container c=frame.getContentPane();
    c.add(panel,BorderLayout.NORTH);
    c.add(pane);
    
    
    frame.setSize(400,300);
    frame.show();
  }
}