On Mon, 29 Jun 2026 04:54:26 GMT, Prasanta Sadhukhan <[email protected]>
wrote:
> When JTable.setAutoResizeMode is called with JTable.AUTO_RESIZE_LAST_COLUMN,
> it is supposed to adjust the delta width to the last column only when table
> itself changes width
> but before JDK-8234071 fix, AUTO_RESIZE_LAST_COLUMN, was behaving exactly as
> if user specified AUTO_RESIZE_ALL_COLUMNS
> so width of all columns of table gets adjusted.
>
> JDK-8234071 fixes this issue by setting "resizingColumn" to last column when
> AUTO_RESIZE_LAST_COLUMN is specified so that only last column gets resized
> but the fix was wrongly instructing the JTable that the user is currently
> resizing the last column with the mouse
> so JTable started believing a header resize was active even during normal
> layout, window resizing or cell editing
> thus it caused side-effects like initial preferred column widths was ignored
> as seen in JDK-8375573
> and real mouse resizing of another column was conflicting with the “last
> column is resizing” state as mousePressed/Released uses "resizingColumn" to
> ensure a certain column is getting resized
> and editing is disturbed because JTable thought column resizing/layout
> activity is happening as seen in this particular issue.
>
> The issue is that a left click on an editable cell starts editing and then
> selects the cell.
> Selecting the cell scrolls it into view, which revalidates the table and
> runs doLayout().
> Because the header now permanently reports a resizing column, the layout
> pass adjusts a column's preferred width
> and fires TableColumnModelListener.columnMarginChanged().
> JTable.columnMarginChanged() stops the active cell editor.
>
> Also, after a user drags the first column header divider, resizingColumn is
> reset to null in `BasicTableHeaderUI.mouseReleased` and
> JTable then syncs preferred widths from actual widths using
> `setWidthsFromPreferredWidths(true)`.
> Later, when the dialog is resized, `setWidthsFromPreferredWidths(false)`
> runs again and all columns are recalculated so AUTO_RESIZE_LAST_COLUMN was
> not honoured
>
> Fix is made to handle AUTO_RESIZE_LAST_COLUMN in the layout code
> so the width distribution logic ensures that
> During normal window/dialog resize: change is made only to the last column.
> During initial layout: honors the user’s preferred widths, then let the
> last column absorbs extra space.
> During real header drag: allows the dragged column to resize, and uses the
> last column to compensate.
> and it doesn't hamper editing of any cell in last column when double-clicked
>
>
>
>
> ---------
> - [x] I confirm that I make this ...
code review only; I did not test the build.
src/java.desktop/share/classes/javax/swing/JTable.java line 3282:
> 3280: for (int i = 0; i < columnModel.getColumnCount(); i++) {
> 3281: TableColumn column = columnModel.getColumn(i);
> 3282: if (column.getPreferredWidth() != 75 && column.getWidth()
> == 75) {
magic constant warning: testing for unrelated condition that might fail. I
think you need to consider a different criteria.
-------------
PR Review: https://git.openjdk.org/jdk/pull/31704#pullrequestreview-4869098989
PR Review Comment: https://git.openjdk.org/jdk/pull/31704#discussion_r3724320866