JDK-6509786 : Bug 5049957 regressed, XP L&F crashes if user hotswaps XP theme
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 6
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2007-01-04
  • Updated: 2010-04-02
  • Resolved: 2007-03-19
Related Reports
Duplicate :  
Description
The bug 5049957 appears to still be present. I have confirmed that the following code from an external reporter still exhibits this bug, or at least what appears to be this bug.

OK, here is the code.  Simply run this application on a Windows XP machine and then change the XP theme.  A NPE will be thrown.

[code]
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;

public class NPETest extends JFrame
{
	private JTable table;
	private JScrollPane pane;

	private class HeaderRenderer implements TableCellRenderer
	{
		private TableCellRenderer tableCellRenderer;

		public HeaderRenderer(TableCellRenderer tableCellRenderer)
		{
			this.tableCellRenderer = tableCellRenderer;
		}

		public Component getTableCellRendererComponent(JTable table, Object value,
		  boolean isSelected, boolean hasFocus,int row, int column)
		{
			Component c = tableCellRenderer.getTableCellRendererComponent(table, 
			  value, isSelected, hasFocus, row, column);
			return c;
		}
	}

	class MyHeader extends JTableHeader
	{
		public MyHeader(TableColumnModel model)
		{
			super(model);
			setDefaultRenderer(new HeaderRenderer(getDefaultRenderer()));
		}
	}

	public NPETest()
	{
		try
		{
			UIManager.setLookAndFeel(new WindowsLookAndFeel());
		}
		catch (UnsupportedLookAndFeelException ulafe)
		{
		}
		Object[][] data = new Object[][] {{1, 2, 3, 4, 5, 6},
				                          {2, 4, 8, 9, 5, 7},
		                                  {3, 1, 6, 5, 3, 2},
		                                  {4, 6, 6, 7, 6, 8}};
		String[] colNames = new String[] {"A", "B", "C", "D", "E", "F"};
		setLayout(new BorderLayout());
		pane = new JScrollPane();
		table = new JTable(data, colNames);
		table.setTableHeader(new MyHeader(table.getColumnModel()));
		pane.setViewportView(table);
		add(pane, BorderLayout.CENTER);
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
		{
			public void run()
			{
				new NPETest().setVisible(true);
			}
		});
	}
}
[/code]

It produces the following stack trace in the latest version of Java 6 available from java.sun.com when switching the theme in Windows XP Pro, SP 2.

java.lang.NullPointerException
        at com.sun.java.swing.plaf.windows.WindowsTableHeaderUI$XPDefaultRenderer.paint(WindowsTableHeaderUI.java:95)
        at javax.swing.CellRendererPane.paintComponent(CellRendererPane.java:134)
        at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderUI.java:665)
        at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:607)
        at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
        at javax.swing.JComponent.paintComponent(JComponent.java:758)
        at javax.swing.JComponent.paint(JComponent.java:1022)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JViewport.paint(JViewport.java:747)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JSplitPane.paintChildren(JSplitPane.java:1026)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JSplitPane.paintChildren(JSplitPane.java:1026)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paint(JComponent.java:1031)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
        at javax.swing.JComponent.paintChildren(JComponent.java:859)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5111)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
        at javax.swing.JComponent.paint(JComponent.java:1008)
        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:1797)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:734)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)