import java.text.*; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; import javax.swing.table.TableCellRenderer; import javax.swing.DefaultCellEditor; /* Demo modified from Walrath and Campione's TableDemo.java The JFC Swing Tutorial: Java 2 Platform, Addison Wesley 1999 Extends DefaultTableModel and overwrites isCellEditable instead of AbstractTableModel; just to be different from the textbook. Uses TableCellRenderers, DefaultTableCellRenders, and TableCellEditors Uses myTableUpdate to show the values of TableListenerEvent mike barnes 9/18/03 */ public class TableDemo extends JFrame { private JTable table; private Vector rowData, columnHeaders; private boolean bool; private JPanel panel; private JButton addButton; private static final String addString = "Add Row"; private Vector data; private MyDefaultTableModel model; public TableDemo() { super("Diet Diary"); bool = true; data = new Vector(); data.add(new Date()); data.add(new Integer(2150)); data.add(new Integer(650)); data.add(new Boolean(false)); rowData = new Vector(); columnHeaders = new Vector(); columnHeaders.add("Date"); columnHeaders.add("Calories"); columnHeaders.add("Fat"); columnHeaders.add("Exercise"); rowData.add(data); // add first row here model = new MyDefaultTableModel(rowData, columnHeaders); model.addTableModelListener(new myTableUpdate()); //Create the table and put it in a scroll pane table = new JTable(model); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane listScrollPane = new JScrollPane(table); // create cell renders and editors for columns setUpDateColumn(table.getColumnModel().getColumn(0)); setUpCaloriesColumn(table.getColumnModel().getColumn(1)); setUpFatColumn(table.getColumnModel().getColumn(2)); setUpExerciseColumn(table.getColumnModel().getColumn(3)); // add button to insert rows addButton = new JButton(addString); addButton.addActionListener(new AddListener()); //Create a panel that uses FlowLayout (the default). JPanel buttonPane = new JPanel(); buttonPane.add(addButton); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); listScrollPane.setPreferredSize(new Dimension(300, 200)); contentPane.add(listScrollPane, BorderLayout.CENTER); contentPane.add(buttonPane, BorderLayout.SOUTH); } // column set up methods: set column width, create // cell editors and renderers. public void setUpDateColumn(TableColumn col) { col.setPreferredWidth(100); col.setCellRenderer(new DateRender()); } public void setUpCaloriesColumn(TableColumn col) { Vector cals = new Vector(); for(int i = 800; i <= 4000; i += 50) cals.addElement(new Integer(i)); JComboBox combo = new JComboBox(cals); col.setCellEditor(new DefaultCellEditor(combo)); col.setCellRenderer(new CaloriesRender()); } // Create the combobox cell editor // Note the example in the text on page 266 is wrong on arg type // This column used the default cell render public void setUpFatColumn(TableColumn col) { Vector cals = new Vector(); for(int i = 500; i <= 2000; i += 50) cals.addElement(new Integer(i)); JComboBox combo = new JComboBox(cals); col.setCellEditor(new DefaultCellEditor(combo)); } // Create the checkbox cell render, this cell not editable public void setUpExerciseColumn(TableColumn col) { col.setCellRenderer(new checkboxCellRender()); } class MyDefaultTableModel extends DefaultTableModel { public MyDefaultTableModel(Vector r, Vector c) { super(r, c); } public boolean isCellEditable(int row, int col) { if (col == 3) return false; else return true; } } // customize a defaultTableCellRender class DateRender extends DefaultTableCellRenderer { public Component getTableCellRendererComponent( JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int col) { SimpleDateFormat df = new SimpleDateFormat("EEE, MMM d, yy"); System.out.println("dataCellRender " + df.format((Date) value)); setValue(df.format((Date) value)); if (isSelected) setBackground(new Color(200, 200, 255)); else setBackground(Color.white); return this; } } class CaloriesRender extends DefaultTableCellRenderer { public Component getTableCellRendererComponent( JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int col) { int calories; setValue(value); calories = ((Integer) value).intValue(); if ( calories <= 1800) setBackground(Color.green); else if (calories > 1800 && calories < 2600) setBackground(Color.white); else if (calories >= 2600) setBackground(Color.red); return this; } } class checkboxCellRender extends JCheckBox implements TableCellRenderer{ public Component getTableCellRendererComponent( JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int col) { JCheckBox cb = new JCheckBox(); // convert Boolean to boolean cb.setSelected(((Boolean) value).booleanValue()); // below is cludge for the selected color. // need to get correct color from current system customization. if (isSelected) cb.setBackground(new Color(200, 200, 255)); else cb.setBackground(Color.white); System.out.println("checkboxCellRender"); return cb; } } // This listener is shared by the text field and the ToDo button class AddListener implements ActionListener { public void actionPerformed(ActionEvent e) { Vector data = new Vector(4); Random rand = new Random(); data.add(0, new Date()); data.add(1, new Integer(2150)); data.add(2, new Integer(650)); // get random boolean. rand.nextBoolean() doesn't seem uniform. data.add(3, new Boolean((rand.nextInt() % 2 == 0))); model.addRow(data); for(int i = 0; i < rowData.size(); i++) System.out.println(i + " " + rowData.elementAt(i));} } // displays what cell has been changed class myTableUpdate implements TableModelListener { public void tableChanged(TableModelEvent e) { System.out.println("Table Model has been changed:"); System.out.println("\t column changed " + e.getColumn()); System.out.println("\t first row changed " + e.getFirstRow()); System.out.println("\t last row changed " + e.getLastRow()); System.out.print("\t type of change "); switch (e.getType()) { case TableModelEvent.INSERT : System.out.println("insert"); break; case TableModelEvent.UPDATE : System.out.println("update"); break; case TableModelEvent.DELETE : System.out.println("delete"); break; } } } public static void main(String s[]) { JFrame frame = new TableDemo(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } }