Duplicate :
|
|
Relates :
|
|
Relates :
|
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
|