package org.exist.client.xacml; import java.awt.Component; import java.awt.Dimension; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; public class ResizingTable extends JTable { public ResizingTable() { super(); initColumns(); } public ResizingTable(TableModel tableModel, TableColumnModel columnModel) { super(tableModel, columnModel); } public ResizingTable(TableModel model) { super(model); initColumns(); } private void initColumns() { setIntercellSpacing(new Dimension(3,3)); setAutoResizeMode(AUTO_RESIZE_OFF); setColumnWidths(); } public void tableChanged(TableModelEvent event) { super.tableChanged(event); //fix for a NullPointerException when setModel from JTable constructor // generates a tableChanged event if(defaultRenderersByColumnClass != null) setColumnWidths(); } private void setColumnWidths() { if(columnModel == null) return; int[] width = new int[getColumnCount()]; getHeaderWidths(width); getCellMaxWidths(width); setCellWidths(width, false); } private void getHeaderWidths(int[] width) { JTableHeader header = getTableHeader(); for(int column = 0; column < width.length; column++) { TableCellRenderer renderer = columnModel.getColumn(column).getHeaderRenderer(); if(renderer == null) { if(header == null) continue; renderer = header.getDefaultRenderer(); if(renderer == null) continue; } Component comp = renderer.getTableCellRendererComponent(this, getColumnName(column), false, false, -1, column); Dimension prefSize = comp.getPreferredSize(); if(prefSize.width > width[column]) width[column] = prefSize.width; } } private void setCellWidths(int[] width, boolean override) { int spacingWidth = getIntercellSpacing().width * 2; for(int column = 0; column < width.length; column++) { TableColumn tableColumn = columnModel.getColumn(column); int newWidth = width[column] + spacingWidth + 6; if(override) tableColumn.setPreferredWidth(newWidth); else { int currentWidth = tableColumn.getWidth(); tableColumn.setPreferredWidth(Math.max(currentWidth, newWidth)); } } } private void getCellMaxWidths(int[] width) { int rowCount = getRowCount(); for(int row = 0; row < rowCount; row++) { for(int column = 0; column < width.length; column++) { TableCellRenderer renderer = getCellRenderer(row, column); if(renderer == null) renderer = getDefaultRenderer(getModel().getColumnClass(column)); if(renderer == null) continue; Object value = getValueAt(row, column); boolean isSelected = isCellSelected(row, column); Component comp = renderer.getTableCellRendererComponent(this, value, isSelected, false, row, column); width[column] = Math.max(comp.getPreferredSize().width, width[column]); } } } public Dimension getPreferredScrollableViewportSize() { Dimension prefSize = getPreferredSize(); Dimension maxSize = getMaximumSize(); Dimension minSize = getMinimumSize(); int width = Math.max(Math.min(maxSize.width, prefSize.width), minSize.width); int height = Math.max(Math.min(maxSize.height, prefSize.height), minSize.height); return new Dimension(width, height); } public boolean getScrollableTracksViewportWidth() { return getPreferredSize().width < getParent().getSize().width; } }