<Swing Dev> May AbstractButton.doClick() be called by non-edt threads?

Pavel Porvatov pavel.porvatov at oracle.com
Tue Nov 1 12:20:29 UTC 2011


Hi Clemens,
> Hi,
>
> I recently got a really strange NPE when running Java2Demo, and by
> looking at the code it seems this NPE can only be caused by threading
> violations.
> (Component.maxSizeSet set to true, while Component.maxSize not visible)
>
> I had a look at Java2Demo's source, where I found code like this
> (ClipAnim.DemoControls.run()):
>
> @Override
>          public void run() {
>              ((AbstractButton) toolbar.getComponentAtIndex(2)).doClick();
>          }
>
> According to CustomControls.start(), this overriden run-method is
> executed on a fresh thread, so outside of the EDT.
> May AbstractButton.doClick() be called from outside the EDT?
Of course all Swing methods (if javadoc doesn't say the opposite) must 
be called from EDT thread. I filed CR 7107119 (NPE when running 
Java2Demo), which should become visible on bugs.sun.com soon.

Thanks, Pavel
> Furthermore, is there any reason CustomControls.stop() is
> synchronized, while start() isn't?
>
> Thanks, Clemens
>
>
> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> 	at java.awt.Dimension.<init>(Dimension.java:111)
> 	at java.awt.Component.getMaximumSize(Component.java:2751)
> 	at java.awt.Container.getMaximumSize(Container.java:1887)
> 	at javax.swing.JComponent.getMaximumSize(JComponent.java:1698)
> 	at javax.swing.BoxLayout.checkRequests(BoxLayout.java:484)
> 	at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:300)
> 	at javax.swing.JToolBar$DefaultToolBarLayout.preferredLayoutSize(JToolBar.java:771)
> 	at java.awt.Container.preferredSize(Container.java:1788)
> 	at java.awt.Container.getPreferredSize(Container.java:1773)
> 	at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
> 	at java.awt.FlowLayout.layoutContainer(FlowLayout.java:609)
> 	at java.awt.Container.layout(Container.java:1503)
> 	at java.awt.Container.doLayout(Container.java:1492)
> 	at java.awt.Container.validateTree(Container.java:1688)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validate(Container.java:1623)
> 	at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:653)
> 	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1620)
> 	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
> 	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
> 	at java.awt.EventQueue.access$000(EventQueue.java:101)
> 	at java.awt.EventQueue$3.run(EventQueue.java:666)
> 	at java.awt.EventQueue$3.run(EventQueue.java:664)
> 	at java.security.AccessController.doPrivileged(Native Method)
> 	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
> 	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
> 	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
> 	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
> 	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
> 	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
>
>
> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> 	at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:301)
> 	at javax.swing.JToolBar$DefaultToolBarLayout.preferredLayoutSize(JToolBar.java:771)
> 	at java.awt.Container.preferredSize(Container.java:1788)
> 	at java.awt.Container.getPreferredSize(Container.java:1773)
> 	at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
> 	at java.awt.FlowLayout.layoutContainer(FlowLayout.java:609)
> 	at java.awt.Container.layout(Container.java:1503)
> 	at java.awt.Container.doLayout(Container.java:1492)
> 	at java.awt.Container.validateTree(Container.java:1688)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validateTree(Container.java:1697)
> 	at java.awt.Container.validate(Container.java:1623)
> 	at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1446)
> 	at javax.swing.plaf.basic.BasicTabbedPaneUI.paint(BasicTabbedPaneUI.java:787)
> 	at javax.swing.plaf.metal.MetalTabbedPaneUI.paint(MetalTabbedPaneUI.java:843)
> 	at javax.swing.plaf.metal.MetalTabbedPaneUI.update(MetalTabbedPaneUI.java:724)
> 	at javax.swing.JComponent.paintComponent(JComponent.java:778)
> 	at javax.swing.JComponent.paint(JComponent.java:1054)
> 	at javax.swing.JComponent.paintChildren(JComponent.java:887)
> 	at javax.swing.JComponent.paint(JComponent.java:1063)
> 	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
> 	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
> 	at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
> 	at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
> 	at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
> 	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
> 	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
> 	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
> 	at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
> 	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
> 	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
> 	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
> 	at java.awt.EventQueue.access$000(EventQueue.java:101)
> 	at java.awt.EventQueue$3.run(EventQueue.java:666)
> 	at java.awt.EventQueue$3.run(EventQueue.java:664)
> 	at java.security.AccessController.doPrivileged(Native Method)
> 	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
> 	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
> 	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
> 	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
> 	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
> 	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
> 	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)




More information about the swing-dev mailing list