import  java.awt.BorderLayout;
import  java.awt.Component;
import  java.awt.Dimension;
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.WindowConstants;
import  javax.swing.table.DefaultTableCellRenderer;
import  javax.swing.table.TableCellRenderer;
import  javax.swing.table.TableColumn;


public   class  FixTableColumnWidthFrame  extends  JFrame  {
    Object[] columnNames_ 
=   { " First Name " " MI " " Last Name " } ;

    Object[][] names_ 
=   {
                            
" Lynn " " M. " " Seckinger "  } ,
                            
" Carol " " R. " " Seckinger "  } ,
                            
" Roy " " D. " " Martin "  } ,
                            
" Bill " " O. " " Veryveryveryverylonglastname "  } ,
                            
" Richard " " A. " " Tattersall "  } ,
                            
" Philip " " B. " " Edwards "  } ,
                            
" Moore " " T. " " Moore "  } ,
                            
                            
//  shorten scrollbar grip with these 
                             " Lynn " " M. " " Seckinger "  } ,
                            
" Carol " " R. " " Seckinger "  } ,
                            
" Roy " " D. " " Martin "  } ,
                            
" Bill " " O. " " Veryveryveryverylonglastname "  } ,
                            
" Richard " " A. " " Tattersall "  } ,
                            
" Philip " " B. " " Edwards "  } ,
                            
" Moore " " T. " " Moore "  } ,
                        }
;
    JTable table_ 
=   new  JTable(names_, columnNames_);
    
public  FixTableColumnWidthFrame()  {
        TableUtilities.fixTableColumnWidth(table_);
        JScrollPane scroll 
=   new  JScrollPane(table_);
//         scroll.setPreferredSize(table_.getPreferredSize());
        getContentPane().add(scroll, BorderLayout.CENTER);
        pack();
    }

    
    
public   static   void  main(String args[])  {
        FixTableColumnWidthFrame frame 
=   new  FixTableColumnWidthFrame();
        frame.setTitle(
" Setting Column Widths " );
        frame.pack();
        frame.show();
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frame.addWindowListener(
new  WindowAdapter()  {
            
public   void  windowClosed(WindowEvent e)  {
                System.exit(
0 );
            }

        }
);
    }

}




class  TableUtilities  {
    
public   static  Dimension fixTableColumnWidth(JTable table)  {
        
int  MaxWidth  =   0 ;
        
int  width  =   0 ;
        
for  ( int  i  =   0 ; i  <  table.getColumnCount(); i ++ {
            TableColumn col 
=  table.getColumn(table.getColumnName(i));
            width 
=  getPreferredWidthForColumn(table, col);
            col.setMinWidth(width);
            col.setMaxWidth(width);
            MaxWidth 
+=  width;
        }

        
//  sizeColumnsToFit() must be called due to a JTable
        
//  bug 
        table.sizeColumnsToFit( 0 );
        Dimension tableSize 
=   new  Dimension(MaxWidth, table.getPreferredSize().height);
        table.setPreferredSize(tableSize);
        
return  tableSize;
    }

    
public   static   int  getPreferredWidthForColumn(JTable table, TableColumn col)  {
        
int  hw  =  columnHeaderWidth(table, col),    //  hw = header width
            cw  =  widestCellInColumn(table, col);   //  cw = column width

        
return  hw  >  cw  ?  hw : cw;
    }

    
private   static   int  columnHeaderWidth(JTable table, TableColumn col)  {
        TableCellRenderer renderer 
=  col.getHeaderRenderer();
        
if  (renderer  ==   null {
            renderer 
=   new  DefaultTableCellRenderer();
            ((DefaultTableCellRenderer)renderer).setText(col.getHeaderValue().toString());
        }

        Component comp 
=  renderer.getTableCellRendererComponent(
                                      table, col.getHeaderValue(), 
                                      
false false 0 0 );

        
return  comp.getPreferredSize().width  +   2 ;
    }

    
private   static   int  widestCellInColumn(JTable table, TableColumn col)  {
        
int  c  =  col.getModelIndex(), width = 0 , maxw = 0 ;

        
for ( int  r = 0 ; r  <  table.getRowCount();  ++ r)  {
            TableCellRenderer renderer 
=  
                              table.getCellRenderer(r,c);

            Component comp 
=  
                renderer.getTableCellRendererComponent(
                                      table, table.getValueAt(r,c), 
                                      
false false , r, c);

            width 
=  comp.getPreferredSize().width  +   2 ;
            maxw 
=  width  >  maxw  ?  width : maxw;
        }

        
return  maxw;
    }

}