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 contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - 8387267: Editor for the last column in JTable is hard to activate after 
AUTO_RESIZE_LAST_COLUMN was configured

Changes: https://git.openjdk.org/jdk/pull/31704/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=31704&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8387267
  Stats: 158 lines in 2 files changed: 139 ins; 18 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/31704.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/31704/head:pull/31704

PR: https://git.openjdk.org/jdk/pull/31704

Reply via email to