package com.ibm.nmon.gui.util; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; /** * Fix to allow tables to autosize columns yet still actually scroll when in a scroll pane. By * default tables never scroll, the columns just get smaller. */ public final class ScrollingTableFix implements ComponentListener { private final JTable table; public ScrollingTableFix(JTable table, JScrollPane scrollPane) { assert table != null; this.table = table; table.getModel().addTableModelListener(new ColumnAddFix(table, scrollPane)); } public void componentHidden(final ComponentEvent event) {} public void componentMoved(final ComponentEvent event) {} public void componentResized(final ComponentEvent event) { // turn off resize and let the scroll bar appear once the component is smaller than the // table if (event.getComponent().getWidth() < table.getPreferredSize().getWidth()) { table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); } // otherwise resize new columns in the table else { table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); } } public void componentShown(final ComponentEvent event) {} // similar behavior is needed when columns are added to the table private static final class ColumnAddFix implements TableModelListener { private final JTable table; private final JScrollPane scrollPane; ColumnAddFix(JTable table, JScrollPane scrollPane) { this.table = table; this.scrollPane = scrollPane; } @Override public void tableChanged(TableModelEvent e) { if (e.getFirstRow() == TableModelEvent.HEADER_ROW) { if (scrollPane.getViewport().getWidth() < table.getPreferredSize().getWidth()) { table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); } else { table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); } } } } }