# 3
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class FixedColumnExample extends JFrame
{
Object[][]data;
Object[]column;
JTablefixedTable, table;
public FixedColumnExample()
{
super("Fixed Column Example");
setSize(400, 150);
data = new Object[][]
{
{ "1", "11", "A", "", "", "", "", "" },
{ "2", "22", "", "B", "", "", "", "" },
{ "3", "33", "", "", "C", "", "", "" },
{ "4", "44", "", "", "", "D", "", "" },
{ "5", "55", "", "", "", "", "E", "" },
{ "6", "66", "", "", "", "", "", "F" } };
column = new Object[]
{ "fixed 1", "fixed 2", "a", "b", "c", "d", "e", "f" };
final int rows = data.length;
final int cols = column.length;
TableModel fixedModel = new DefaultTableModel()
{
// We have two fixed rows so report 2 columns from data
public int getColumnCount()
{
return 2;
}
public int getRowCount()
{
return rows;
}
public String getColumnName(int col)
{
return (String) column[col];
}
// As only the first two columns are reported this can stay
// the same
public Object getValueAt(int row, int col)
{
return data[row][col];
}
};
TableModel model = new DefaultTableModel()
{
// This model has two less columns in the data as two are
// fixed
public int getColumnCount()
{
return cols - 2;
}
public int getRowCount()
{
return rows;
}
public String getColumnName(int col)
{
// The columns start 2 on in the data
return (String) column[col + 2];
}
public Object getValueAt(int row, int col)
{
// The first two column are for the fixed table so return
// data after by adding 2
return data[row][col + 2];
}
public void setValueAt(Object obj, int row, int col)
{ // As above
data[row][col + 2] = obj;
}
public boolean isCellEditable(int row, int col)
{
return true;
}
};
fixedTable = new JTable(fixedModel);
ListSelectionModel lsm = fixedTable.getSelectionModel();
fixedTable.getTableHeader().setResizingAllowed(false);
lsm.addListSelectionListener(new SelectionListener(true));
table = new JTable(model);
lsm = table.getSelectionModel();
lsm.addListSelectionListener(new SelectionListener(false));
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scroll = new JScrollPane(table);
JViewport viewport = new JViewport();
viewport.setView(fixedTable);
viewport.setPreferredSize(fixedTable.getPreferredSize());
scroll.setRowHeaderView(viewport);
scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
.getTableHeader());
getContentPane().add(scroll, BorderLayout.CENTER);
}
class SelectionListener implements ListSelectionListener
{
booleanisFixedTable= true;
public SelectionListener(boolean isFixedTable)
{
this.isFixedTable = isFixedTable;
}
public void valueChanged(ListSelectionEvent e)
{
if (isFixedTable)
{
int fixedSelectedIndex = fixedTable.getSelectedRow();
table.setRowSelectionInterval(fixedSelectedIndex,
fixedSelectedIndex);
} else
{
int selectedIndex = table.getSelectedRow();
fixedTable
.setRowSelectionInterval(selectedIndex, selectedIndex);
}
}
}
public static void main(String[] args)
{
FixedColumnExample frame = new FixedColumnExample();
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
frame.setVisible(true);
}
}