-
Bug
-
Resolution: Unresolved
-
P4
-
None
-
5.0, 6
-
x86
-
windows_xp
Name: gm110360 Date: 05/19/2004
FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32c)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
Using a custom TableCellRenderer for JTableHeader (like the TableSorter explained in Swing Tutorial does) with XP look & feel leads to an unrecoverable crash of Swing painting loop when user hotswaps the Windows XP desktop colors theme (i.e. from "blue" to "light gray") "under the feet" of the Java application.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a JFrame.
Create a JTable.
Create a custom TableCellRenderer.
Get JTable's JTableHeader and replace its default renderer with the custom one.
Add the JTable to a JScrollPane and the JScrollPane to the content panel of the JFrame.
Display the JFrame in an application with XP look and feel enabled.
While the JFrame is displayed, open the Windows desktop properties and change the current color theme (i.e. from "blue" to "light gray")
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
JFrame look & feel change reflecting the modified desktop color theme. Application continues to run normally.
ACTUAL -
Application stops repainting itself, because of an uncaught NPE thrown during the painting loop.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Using JSDK1.4.2:
java.lang.NullPointerException
at com.sun.java.swing.plaf.windows.WindowsTableHeaderUI$XPDefaultRendere
r.paint(WindowsTableHeaderUI.java:81)
at javax.swing.CellRendererPane.paintComponent(CellRendererPane.java:134
)
at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderU
I.java:401)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.ja
va:341)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
at javax.swing.JComponent.paintComponent(JComponent.java:541)
at javax.swing.JComponent.paint(JComponent.java:808)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JViewport.paint(JViewport.java:722)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:557)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4802)
at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4748)
at javax.swing.JComponent.paint(JComponent.java:798)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:
60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97
)
at java.awt.Container.paint(Container.java:1312)
at sun.awt.RepaintArea.paint(RepaintArea.java:177)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:260)
at java.awt.Component.dispatchEventImpl(Component.java:3678)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Using JSDK 1.5.0-beta:
java.lang.NullPointerException
at com.sun.java.swing.plaf.windows.WindowsTableHeaderUI$XPDefaultRendere
r.paint(WindowsTableHeaderUI.java:138)
at javax.swing.CellRendererPane.paintComponent(CellRendererPane.java:134
)
at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderU
I.java:394)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.ja
va:341)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
at javax.swing.JComponent.paintComponent(JComponent.java:714)
at javax.swing.JComponent.paint(JComponent.java:977)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JViewport.paint(JViewport.java:722)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:559)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4882)
at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4828)
at javax.swing.JComponent.paint(JComponent.java:967)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:
60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97
)
at java.awt.Container.paint(Container.java:1704)
at javax.swing.JFrame.update(JFrame.java:392)
at sun.awt.RepaintArea.updateComponent(RepaintArea.java:239)
at sun.awt.RepaintArea.paint(RepaintArea.java:216)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:247)
at java.awt.Component.dispatchEventImpl(Component.java:4007)
at java.awt.Container.dispatchEventImpl(Container.java:2019)
at java.awt.Window.dispatchEventImpl(Window.java:1757)
at java.awt.Component.dispatchEvent(Component.java:3779)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class XPTableHeaderTest extends JFrame {
public XPTableHeaderTest() {
super("XPTableHeaderTest");
JTable table = new JTable(new Object[][] {
new Object[] {"a1", "b1", "c1"}
,
new Object[] {"a2", "b2", "c2"}
}
,
new Object[] {"A", "B", "C"});
JTableHeader header = table.getTableHeader();
header.setDefaultRenderer(new CustomRenderer(
header.getDefaultRenderer()));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
setBounds(0, 0, 640, 400);
validate();
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
new XPTableHeaderTest().show();
}
private static class CustomRenderer implements TableCellRenderer {
private TableCellRenderer delegate;
public CustomRenderer(TableCellRenderer delegate) {
this.delegate = delegate;
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
return delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
}
}
}
---------- END SOURCE ----------
(Incident Review ID: 270368)
======================================================================
###@###.### 10/13/04 18:37 GMT
FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32c)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]
A DESCRIPTION OF THE PROBLEM :
Using a custom TableCellRenderer for JTableHeader (like the TableSorter explained in Swing Tutorial does) with XP look & feel leads to an unrecoverable crash of Swing painting loop when user hotswaps the Windows XP desktop colors theme (i.e. from "blue" to "light gray") "under the feet" of the Java application.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a JFrame.
Create a JTable.
Create a custom TableCellRenderer.
Get JTable's JTableHeader and replace its default renderer with the custom one.
Add the JTable to a JScrollPane and the JScrollPane to the content panel of the JFrame.
Display the JFrame in an application with XP look and feel enabled.
While the JFrame is displayed, open the Windows desktop properties and change the current color theme (i.e. from "blue" to "light gray")
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
JFrame look & feel change reflecting the modified desktop color theme. Application continues to run normally.
ACTUAL -
Application stops repainting itself, because of an uncaught NPE thrown during the painting loop.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Using JSDK1.4.2:
java.lang.NullPointerException
at com.sun.java.swing.plaf.windows.WindowsTableHeaderUI$XPDefaultRendere
r.paint(WindowsTableHeaderUI.java:81)
at javax.swing.CellRendererPane.paintComponent(CellRendererPane.java:134
)
at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderU
I.java:401)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.ja
va:341)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
at javax.swing.JComponent.paintComponent(JComponent.java:541)
at javax.swing.JComponent.paint(JComponent.java:808)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JViewport.paint(JViewport.java:722)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paint(JComponent.java:817)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:557)
at javax.swing.JComponent.paintChildren(JComponent.java:647)
at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4802)
at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4748)
at javax.swing.JComponent.paint(JComponent.java:798)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:
60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97
)
at java.awt.Container.paint(Container.java:1312)
at sun.awt.RepaintArea.paint(RepaintArea.java:177)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:260)
at java.awt.Component.dispatchEventImpl(Component.java:3678)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Using JSDK 1.5.0-beta:
java.lang.NullPointerException
at com.sun.java.swing.plaf.windows.WindowsTableHeaderUI$XPDefaultRendere
r.paint(WindowsTableHeaderUI.java:138)
at javax.swing.CellRendererPane.paintComponent(CellRendererPane.java:134
)
at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderU
I.java:394)
at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.ja
va:341)
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
at javax.swing.JComponent.paintComponent(JComponent.java:714)
at javax.swing.JComponent.paint(JComponent.java:977)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JViewport.paint(JViewport.java:722)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paint(JComponent.java:986)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:559)
at javax.swing.JComponent.paintChildren(JComponent.java:814)
at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4882)
at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4828)
at javax.swing.JComponent.paint(JComponent.java:967)
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:
60)
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97
)
at java.awt.Container.paint(Container.java:1704)
at javax.swing.JFrame.update(JFrame.java:392)
at sun.awt.RepaintArea.updateComponent(RepaintArea.java:239)
at sun.awt.RepaintArea.paint(RepaintArea.java:216)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:247)
at java.awt.Component.dispatchEventImpl(Component.java:4007)
at java.awt.Container.dispatchEventImpl(Container.java:2019)
at java.awt.Window.dispatchEventImpl(Window.java:1757)
at java.awt.Component.dispatchEvent(Component.java:3779)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class XPTableHeaderTest extends JFrame {
public XPTableHeaderTest() {
super("XPTableHeaderTest");
JTable table = new JTable(new Object[][] {
new Object[] {"a1", "b1", "c1"}
,
new Object[] {"a2", "b2", "c2"}
}
,
new Object[] {"A", "B", "C"});
JTableHeader header = table.getTableHeader();
header.setDefaultRenderer(new CustomRenderer(
header.getDefaultRenderer()));
getContentPane().setLayout(new BorderLayout());
getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
setBounds(0, 0, 640, 400);
validate();
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
ex.printStackTrace();
}
new XPTableHeaderTest().show();
}
private static class CustomRenderer implements TableCellRenderer {
private TableCellRenderer delegate;
public CustomRenderer(TableCellRenderer delegate) {
this.delegate = delegate;
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
return delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
}
}
}
---------- END SOURCE ----------
(Incident Review ID: 270368)
======================================================================
###@###.### 10/13/04 18:37 GMT
- duplicates
-
JDK-6509786 Bug 5049957 regressed, XP L&F crashes if user hotswaps XP theme
-
- Closed
-
- relates to
-
JDK-6346886 Windows XP PLAF Table Header with TableSorter.setFont() = NullPointerException
-
- Closed
-
-
JDK-6429812 NPE after calling JTable.updateUI() when using a header renderer + XP L&F
-
- Resolved
-