setReorderingAllowed 
<pre> 
Get the table header using JTable.getTableHeader public JTableHeader getTableHeader() Returns the tableHeader working with this JTable. Then use 
setReorderingAllowed public void setReorderingAllowed(boolean b) Sets whether the user can drag column headers to reorder columns. Parameters: flag - true if the table view should allow reordering You can not directly prevent any arbitrary column from dragging. You can keep track of that though through - TableColumnModel().addColumnModelListener public void addColumnModelListener(TableColumnModelListener x) handle the columnMoved(..) callback and then revert the column back to its original position. You can make n leftmost columns non-movable by spitting your table into fixedLeftColumns table and restOfTheColumnTable mand then sticking the fixedLeftColumns as the RowHeader in a JScrollPane and restOfTheColumnTable in the viewPort of the same JScrollPane. JScrollPane handles the magic of scrolling the two tables togather (Just the way it does with horizontal scrolling of the JTableHeader in its columnHeader position). This works as long as RowHeight between two tables is same. You can infact share the same base table model betweenn the two tables.