FileTable2.java Source code

Java tutorial

Introduction

Here is the source code for FileTable2.java

Source

/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly 
*/
// FileTable2.java
//A test frame for the custom table model, FileModel. This version uses a
//custom renderer (BigRenderer.java) to flag large files with an exclamation
//point icon.

import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;
import java.util.Date;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;

public class FileTable2 extends JFrame {

    public FileTable2() {
        super("Custom TableModel Test");
        setSize(300, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        FileModel fm = new FileModel();
        JTable jt = new JTable(fm);
        jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        jt.setColumnSelectionAllowed(true);
        jt.setDefaultRenderer(Number.class, new BigRenderer(1000));

        JScrollPane jsp = new JScrollPane(jt);
        getContentPane().add(jsp, BorderLayout.CENTER);
    }

    public static void main(String args[]) {
        FileTable2 ft = new FileTable2();
        ft.setVisible(true);
    }
}

//FileModel.java
//A custom table model to display information on a directory of files.
//

class FileModel extends AbstractTableModel {

    String titles[] = new String[] { "Directory?", "File Name", "Read?", "Write?", "Size", "Last Modified" };

    Class types[] = new Class[] { Boolean.class, String.class, Boolean.class, Boolean.class, Number.class,
            Date.class };

    Object data[][];

    public FileModel() {
        this(".");
    }

    public FileModel(String dir) {
        File pwd = new File(dir);
        setFileStats(pwd);
    }

    // Implement the methods of the TableModel interface we're interested
    // in. Only getRowCount(), getColumnCount() and getValueAt() are
    // required. The other methods tailor the look of the table.
    public int getRowCount() {
        return data.length;
    }

    public int getColumnCount() {
        return titles.length;
    }

    public String getColumnName(int c) {
        return titles[c];
    }

    public Class getColumnClass(int c) {
        return types[c];
    }

    public Object getValueAt(int r, int c) {
        return data[r][c];
    }

    //  Our own method for setting/changing the current directory
    // being displayed. This method fills the data set with file info
    // from the given directory. It also fires an update event so this
    // method could also be called after the table is on display.
    public void setFileStats(File dir) {
        String files[] = dir.list();
        data = new Object[files.length][titles.length];

        for (int i = 0; i < files.length; i++) {
            File tmp = new File(files[i]);
            data[i][0] = new Boolean(tmp.isDirectory());
            data[i][1] = tmp.getName();
            data[i][2] = new Boolean(tmp.canRead());
            data[i][3] = new Boolean(tmp.canWrite());
            data[i][4] = new Long(tmp.length());
            data[i][5] = new Date(tmp.lastModified());
        }

        // Just in case anyone's listening...
        fireTableDataChanged();
    }
}

//BigRenderer.java
//A renderer for numbers that shows an icon in front of big numbers.
//

class BigRenderer extends DefaultTableCellRenderer {
    double threshold;

    Icon bang = new ImageIcon("bang.gif");

    public BigRenderer(double t) {
        threshold = t;
        setHorizontalAlignment(JLabel.RIGHT);
        setHorizontalTextPosition(SwingConstants.RIGHT);
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int col) {
        // be a little paranoid about where the user tries to use this renderer
        if (value instanceof Number) {
            if (((Number) value).doubleValue() > threshold) {
                setIcon(bang);
            } else {
                setIcon(null);
            }
        } else {
            setIcon(null);
        }
        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
    }
}