disabling movement of first column in a JTable

Hi,

I have a JTable which also has a horizontal scroll bar.

Could some one suggest the way to freeze only the first column in the JTable. Something akin to the freeze functionality in MS Excel.

Regards,

Rishikesh

[244 byte] By [Mandrake_Ma] at [2007-11-27 11:02:21]
# 1

one of the way is to :

1. create another table with same number of rows as that of original table,

2. have the row header values in the table,

3. and finally add the new table as the "rowHeader" component of the JScrollPane.

see!! easy as 1-2-3 :)

vijaywadnerea at 2007-7-29 12:42:48 > top of Java-index,Desktop,Core GUI APIs...
# 2

try this link

http://www.esus.com/javaindex/j2se/jdk1.2/javaxswing/editableatomiccontrols/jtable/jtablelockfirst.html

search on the google, u will get lots of examples

nirgun_xyza at 2007-7-29 12:42:48 > top of Java-index,Desktop,Core GUI APIs...
# 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);

}

}

Aniruddha-Herea at 2007-7-29 12:42:48 > top of Java-index,Desktop,Core GUI APIs...