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;
????}

}