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

Damon Nguyen dnguyen at openjdk.org
Fri Nov 3 21:10:02 UTC 2023


On Thu, 26 Oct 2023 10:42:52 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:
> 
>   Synth update

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

> 873:             if( !table.getComponentOrientation().isLeftToRight() ) {
> 874:                 x = getWidthInRightToLeft() - x - cm.getColumn(column).getWidth();
> 875:             }

Suggestion:

        if (column < 0) {
            if (!table.getComponentOrientation().isLeftToRight()) {
                x = getWidthInRightToLeft();
            }
        }
        else if (column >= cm.getColumnCount()) {
            if (table.getComponentOrientation().isLeftToRight() ) {
                x = table.getWidth();
            }
        }
        else {
            for (int i = 0; i < column; i++) {
                x += cm.getColumn(i).getWidth();
            }
            if (!table.getComponentOrientation().isLeftToRight()) {
                x = getWidthInRightToLeft() - x - cm.getColumn(column).getWidth();
            }

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

> 876:         }
> 877:         return x;
> 878:     }

Suggestion:

        if (column < 0) {
            if (!table.getComponentOrientation().isLeftToRight()) {
                x = getWidthInRightToLeft();
            }
        }
        else if (column >= cm.getColumnCount()) {
            if (table.getComponentOrientation().isLeftToRight()) {
                x = table.getWidth();
            }
        }
        else {
            for (int i = 0; i < column; i++) {
                x += cm.getColumn(i).getWidth();
            }
            if (!table.getComponentOrientation().isLeftToRight()) {
                x = getWidthInRightToLeft() - x - cm.getColumn(column).getWidth();
            }
        }
        return x;
    }

test/jdk/javax/swing/JTable/JTableRightAlignmentTest.java line 64:

> 62: 
> 63:     public static void main(String[] args) throws Exception {
> 64:         UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

Should this test run on all L&F? Since part of the fix occurs in BasicTableUI.

test/jdk/javax/swing/JTable/JTableRightAlignmentTest.java line 121:

> 119:     private static void saveImage(BufferedImage image, String fileName) {
> 120:         try {
> 121:             ImageIO.write(image, "png", new File(fileName));

Is it OK to save an image here? In the past, I stored my images similar to in #7310 to store the image in the correct area for temporary images for a test.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1382198457
PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1382202632
PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1382203232
PR Review Comment: https://git.openjdk.org/jdk/pull/16374#discussion_r1382203747


More information about the client-libs-dev mailing list