Google

Tuesday, December 25, 2007

Complex Table Example In Java

import java.awt.*;
import java.awt.event.*;
import java.text.Format;
import java.text.NumberFormat;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.JTable;
import javax.swing.JTable.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
import java.sql.*;
import mypackage.MyTableModel;
import mypackage.CustomCellRenderer;

public class ComplexTable extends JPanel implements TableModelListener {





static JFrame myFrame;

static Object[][] data = {
{"Mary", "Campione",
"Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml",
"Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath",
"Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour",
"Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne",
"Pool", new Integer(10), new Boolean(false)}
};



static String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};







public static void main(String args[]){

myFrame = new JFrame("Complex Table Example");
myFrame.getContentPane().setLayout(new BorderLayout());


//TableSorter sorter = new TableSorter(new MyTableModel());
JTable table = new JTable(new MyTableModel());
//sorter.setTableHeader(table.getTableHeader());





JScrollPane scrollPane = new JScrollPane(table);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));

TableColumn column = null;
for (int i = 0; i < 5; i++) { column = table.getColumnModel().getColumn(i); if (i == 2) { column.setPreferredWidth(100); //sport column is bigger } else { column.setPreferredWidth(50); } } table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); TableColumn sportColumn = table.getColumnModel().getColumn(2); JComboBox comboBox = new JComboBox(); comboBox.addItem("Snowboarding"); comboBox.addItem("Rowing"); comboBox.addItem("Chasing toddlers"); comboBox.addItem("Speed reading"); comboBox.addItem("Teaching high school"); comboBox.addItem("None"); sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); TableColumn lastName = table.getColumnModel().getColumn(1); lastName.setCellRenderer( new CustomCellRenderer() ); table.setBackground(Color.lightGray); DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setToolTipText("Click for combo box"); sportColumn.setCellRenderer(renderer); table.getTableHeader().setToolTipText( "Click to sort; Shift-Click to sort in reverse order"); table.setSelectionForeground( Color.white ); table.setSelectionBackground( Color.red ); myFrame.getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START); myFrame.getContentPane().add(table, BorderLayout.CENTER); myFrame.setSize(800,400); myFrame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); myFrame.setVisible(true); } public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); } }

mypackage.MyTableModel


package mypackage;
import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {



private Object[][] data = {
{"Mary", "Campione",
"Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml",
"Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath",
"Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour",
"Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne",
"Pool", new Integer(10), new Boolean(false)}
};



private String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};


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

public int getRowCount() {
return data.length;
}

public String getColumnName(int col) {
return columnNames[col];
}

public Object getValueAt(int row, int col) {
return data[row][col];
}

public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}

/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col <>
return false;
} else {
return true;
}
}

/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}

}

mypackage.CustomCellRenderer


package mypackage;

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class CustomCellRenderer
extends JLabel
implements TableCellRenderer
{
private boolean isSelected;
private boolean hasFocus;


public CustomCellRenderer()
{

}

public Component getTableCellRendererComponent( JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column )
{
String sText = (String)value;
this.isSelected = isSelected;
this.hasFocus = hasFocus;

if( isSelected )
setForeground( Color.red );
else
setForeground( Color.black );
if( hasFocus )
setForeground( Color.cyan );

setText( sText );
return this;
}
}

No comments: