Java tutorial
/* 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); } }