On Fri, 28 Nov 2025 06:29:45 GMT, Prasanta Sadhukhan <[email protected]> wrote:
> When a `JTable `using any objects of type `DefaultTableCellRenderer`, or > subclasses, is serialized, > the colors used to render cells in the JTable subsequent to the call to > `writeObject()` > are forced to the default colors for `DefaultTableCellRenderer`'s immediate > base class, JLabel, causing the colors > defined in the JTable (typically black on white) to be ignored. > > The problem seems to stem from a call to > `installUI `in the `writeObject()` method of `JLabel`, > `DefaultTableCellRenderer`'s base class. > This causes the `setForeground` and `setBackground` methods to be invoked > with specific colors, which turn out to be JLabel's defaults. > Invoking these methods subsequently with parameters of null restores normal > operation same as is explicitly done in `DefaultTableCellRenderer.updateUI()` > https://github.com/openjdk/jdk/blob/195b36f90b789b64f4a0fc867c620935d609a455/src/java.desktop/share/classes/javax/swing/table/DefaultTableCellRenderer.java#L159-L162 > > CI run is ok.. Did you verify that colors are successfully restored after deserialization? (standard and manually set) test/jdk/javax/swing/DefaultTableCellRenderer/DefRendererSerialize.java line 46: > 44: static final String INSTRUCTIONS = """ > 45: A JTable is shown > 46: If the table text is black on white and not black on gray, We can set the table's background color to a bright color, such as red, to distinguish it from the gray. On some displays, it can be difficult to see the difference between `java.awt.Color[r=238,g=238,b=238]` and `java.awt.Color[r=255,g=255,b=255]` with the naked eye. test/jdk/javax/swing/DefaultTableCellRenderer/DefRendererSerialize.java line 62: > 60: static JFrame createTestUI() { > 61: String[][] rowData = { {"1-1","1-2","1-3"}, > 62: {"2-1","2-2","2-3"}, I guess the test could be automated. e.g. if we leave the central cell blank: Suggestion: {"2-1","","2-3"}, We can safely retrieve the pixel color from the center of the cell and check it against the white color Rectangle tableRect = table.getCellRect(1, 1, true); Point tableOnScreen = table.getLocationOnScreen(); Point p = new Point( tableOnScreen.x + tableRect.x + tableRect.width / 2, tableOnScreen.y + tableRect.y + tableRect.height / 2 ); Color pixelColor = robot.getPixelColor(p.x, p.y); // ... color check ------------- PR Review: https://git.openjdk.org/jdk/pull/28549#pullrequestreview-3517761910 PR Review Comment: https://git.openjdk.org/jdk/pull/28549#discussion_r2570711017 PR Review Comment: https://git.openjdk.org/jdk/pull/28549#discussion_r2570685639
