//$Header: /cvsroot-fuse/mec-as2/39/mendelson/util/tables/ColumnFitAdapter.java,v 1.1 2012/04/18 14:10:47 heller Exp $ package de.mendelson.util.tables; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JTable; import javax.swing.table.*; /* * Copyright (C) mendelson-e-commerce GmbH Berlin Germany * * This software is subject to the license agreement set forth in the license. * Please read and agree to all terms before using this software. * Other product and brand names are trademarks of their respective owners. */ /** *Adapter that allows to fit the size of columns on click, use it in the following way: *table.getTableHeader().addMouseListener(new ColumnFitAdapter()); * */ public class ColumnFitAdapter extends MouseAdapter{ public void mouseClicked(MouseEvent e){ if(e.getClickCount()==2){ JTableHeader header = (JTableHeader)e.getSource(); TableColumn tableColumn = getResizingColumn(header, e.getPoint()); if(tableColumn==null) return; int col = header.getColumnModel().getColumnIndex(tableColumn.getIdentifier()); JTable table = header.getTable(); int rowCount = table.getRowCount(); int width = (int)header.getDefaultRenderer() .getTableCellRendererComponent(table, tableColumn.getIdentifier() , false, false, -1, col).getPreferredSize().getWidth(); for(int row = 0; row<rowCount; row++){ int preferedWidth = (int)table.getCellRenderer(row, col).getTableCellRendererComponent(table, table.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth(); width = Math.max(width, preferedWidth); } header.setResizingColumn(tableColumn); // this line is very important tableColumn.setWidth(width+table.getIntercellSpacing().width); } } // copied from BasicTableHeader.MouseInputHandler.getResizingColumn private TableColumn getResizingColumn(JTableHeader header, Point p){ return getResizingColumn(header, p, header.columnAtPoint(p)); } // copied from BasicTableHeader.MouseInputHandler.getResizingColumn private TableColumn getResizingColumn(JTableHeader header, Point p, int column){ if(column==-1){ return null; } Rectangle r = header.getHeaderRect(column); r.grow(-3, 0); if(r.contains(p)) return null; int midPoint = r.x+r.width/2; int columnIndex; if(header.getComponentOrientation().isLeftToRight()) columnIndex = (p.x<midPoint) ? column-1 : column; else columnIndex = (p.x<midPoint) ? column : column-1; if(columnIndex==-1) return null; return header.getColumnModel().getColumn(columnIndex); } }