package com.onaro.util.jfc; import javax.swing.*; import javax.swing.table.TableModel; import javax.swing.event.TableModelListener; import javax.swing.event.TableModelEvent; import com.onaro.commons.swing.OnaroSwingUtilities; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import java.awt.event.ComponentListener; import java.awt.event.ComponentEvent; import java.awt.*; /** * This utility forces the preferred size of a table's view-port to fit the * preferred size of the table. * It work by readjusting the view port size whenever changes to the table's model * are detected. */ public class MinimumTableViewPortSize implements PropertyChangeListener, TableModelListener, ComponentListener { private JTable table; private Component parent; public MinimumTableViewPortSize(JTable table) { this.table = table; adjust(table); table.addPropertyChangeListener(this); table.getModel().addTableModelListener(this); } public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("model")) { //$NON-NLS-1$ ((TableModel)evt.getOldValue()).removeTableModelListener(this); adjust(table); table.getModel().addTableModelListener(this); } else if (evt.getPropertyName().equals("ancestor")) { //$NON-NLS-1$ if (table.getParent() != parent) { if (parent != null) { parent.removeComponentListener(this); } parent = table.getParent(); if (parent != null) { parent.addComponentListener(this); } } } } public void tableChanged(TableModelEvent e) { adjust(table); } public void componentResized(ComponentEvent e) { adjust(table); } public void componentMoved(ComponentEvent e) { } public void componentShown(ComponentEvent e) { adjust(table); } public void componentHidden(ComponentEvent e) { } public static void adjust(JTable table) { Container parent = table.getParent(); if (parent instanceof JViewport) { Dimension size = table.getMinimumSize(); parent = parent.getParent(); if (parent instanceof JScrollPane) { JScrollPane scroll = (JScrollPane)parent; if (!scroll.getVerticalScrollBar().isVisible()) { size.width -= OnaroSwingUtilities.getDefaultScrollBarWidth(); } if (!scroll.getHorizontalScrollBar().isVisible()) { size.height -= OnaroSwingUtilities.getDefaultScrollBarHeight(); } } table.setPreferredScrollableViewportSize(size); TableUtils.distributeColumnExtraSpace(table); } } }