RFR: 5108458: JTable does not properly layout its content [v5]

Prasanta Sadhukhan psadhukhan at openjdk.org
Mon Nov 20 09:53:38 UTC 2023


On Mon, 20 Nov 2023 05:24:51 GMT, Tejesh R <tr at openjdk.org> wrote:

>> Table contents does not follow right-left Orientation when Max width of columns are set. This is due to not considering the offset in `x position` while painting table grid and table cell. The fix handles the offset and adjust the x position for each paint, similar to how header is painted. The fix is applied to both Basic and Synth Look and Feel. 
>> The fix is verified for all Look and Feel manually and test verifies on Metal L&F since automatic test cannot be generalized throughout other Look and Feel. 
>> CI tested is green for regression check and test check.
>
> Tejesh R has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Review fix

src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTableUI.java line 2087:

> 2085:             for (int row = rMin; row <= rMax; row++) {
> 2086:                 cellRect = table.getCellRect(row, cMin, false);
> 2087:                 cellRect.x = getXPosition(cMin);

Why do we need to calculate cellRect.x separately? What is wrong in getting the value already there in `cellRect` ?

src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTableUI.java line 2101:

> 2099:             for (int row = rMin; row <= rMax; row++) {
> 2100:                 cellRect = table.getCellRect(row, cMin, false);
> 2101:                 cellRect.x = getXPosition(cMax);

Is this not a problem that `cellRect` is calculated for `cMin` but `cellRect.x` is calculated for `cMax` which means `cellRect.y` would be of `cMin` column but `cellRect.x` would be of `cMax` column. SImilarly for the `cellRect.width`...You probably can get away maybe because usually all cells have same width but I guess it will be a problem if different cells have different width...Please check..

src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTableUI.java line 2102:

> 2100:                 cellRect = table.getCellRect(row, cMin, false);
> 2101:                 cellRect.x = getXPosition(cMax);
> 2102:                 for (int column = cMax; column >= cMin; column--) {

Is there any reason for choosing to paint from cMax to cMin ie from left-to-right in RTL orientation
when it was done from right-to-left before your fix? 
I guess painting from right-to-left also should work with cellRect.x -= columnWidth ie with no change in code, no?

One more q,
If there are 5 columns, then is it that for LTR cMin is 1, cMax 5 and for RTL cMin is 5 , cMax 1 or viceversa?

src/java.desktop/share/classes/javax/swing/plaf/synth/SynthTableUI.java line 611:

> 609:                     cellRect.width = columnWidth - columnMargin;
> 610:                     paintCell(context, g, cellRect, row, cMax);
> 611:                 }

I guess you removed this in BasicTableUI...Any particular reason for keeping this for Synth..

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1398918527
PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1398858032
PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1398883285
PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1398925522


More information about the client-libs-dev mailing list