This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 197521

Summary: UI-Error for some kind of third party components
Product: guibuilder Reporter: wzberger <wzberger>
Component: CodeAssignee: issues@guibuilder <issues>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P2    
Version: 7.0   
Hardware: PC   
OS: Windows 7 x64   
URL: http://www.jyloo.com
Issue Type: DEFECT Exception Reporter:

Description wzberger 2011-04-07 08:31:28 UTC
We've created a component (JYTabbedPane) which dynamically adds sub-components when a related event occurs. In this case the sub component is a JYLabel which is used as tab title.

Unfortunately the event occurs while FormLAF temporary removed related keys from the UIDefaults which leads to the exception below.

UIDefaults.getUI() failed: no ComponentUI class for: de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI$5[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,f
lags=0,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,horizontalAlignment=LEADING,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,t
ext=,verticalAlignment=CENTER,verticalTextPosition=CENTER]
java.lang.Error
        at javax.swing.UIDefaults.getUIError(UIDefaults.java:712)
        at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:133)
        at javax.swing.UIDefaults.getUI(UIDefaults.java:742)
        at javax.swing.UIManager.getUI(UIManager.java:989)
        at org.jdesktop.swingx.plaf.LookAndFeelAddons.getUI(LookAndFeelAddons.java:308)
        at de.javasoft.swing.JYLabel.updateUI(JYLabel.java:76)
        at javax.swing.JLabel.<init>(JLabel.java:145)
        at javax.swing.JLabel.<init>(JLabel.java:175)
        at de.javasoft.swing.JYLabel.<init>(JYLabel.java:51)
        at de.javasoft.swing.JYLabel.<init>(JYLabel.java:46)
        at de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI$5.<init>(BasicJYTabbedPaneUI.java:1039)
        at de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI.addTab(BasicJYTabbedPaneUI.java:1039)
        at de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI.access$17(BasicJYTabbedPaneUI.java:1031)
        at de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI$4.propertyChange(BasicJYTabbedPaneUI.java:819)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at java.awt.Component.firePropertyChange(Component.java:8132)
        at de.javasoft.swing.JYTabbedPane.firePropertyChange(JYTabbedPane.java:1345)
        at de.javasoft.swing.JYTabbedPane.insertTab(JYTabbedPane.java:386)
        at org.netbeans.modules.form.layoutsupport.delegates.JTabbedPaneSupport.addComponentsToContainer(JTabbedPaneSupport.java:259)
        at org.netbeans.modules.form.layoutsupport.LayoutSupportManager.addComponentsToContainer(LayoutSupportManager.java:668)
        at org.netbeans.modules.form.VisualReplicator.addComponent(VisualReplicator.java:391)
        at org.netbeans.modules.form.VisualReplicator.updateAddedComponents(VisualReplicator.java:357)
        at org.netbeans.modules.form.FormDesigner$FormListener.run(FormDesigner.java:2452)
        at org.netbeans.modules.form.FormLAF$3.run(FormLAF.java:329)
        at org.openide.util.Mutex.doEventAccess(Mutex.java:1361)
        at org.openide.util.Mutex.readAccess(Mutex.java:271)
        at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:312)
        at org.netbeans.modules.form.FormDesigner$FormListener.processEvents(FormDesigner.java:2377)
        at org.netbeans.modules.form.FormDesigner$FormListener.formChanged(FormDesigner.java:2343)
        at org.netbeans.modules.form.FormModel.fireEvents(FormModel.java:1296)
        at org.netbeans.modules.form.FormModel.fireEventBatch(FormModel.java:1269)
        at org.netbeans.modules.form.FormModel.firePendingEvents(FormModel.java:1232)
        at org.netbeans.modules.form.FormModel.access$000(FormModel.java:68)
        at org.netbeans.modules.form.FormModel$2.run(FormModel.java:1212)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

For some reason the issue does *not* occur when the component type (JYLabel) already exists in the form - before adding JYTabbedPane.

After some investigations what's going wrong, the issue seems to be caused by the FormLAF.useDesignerLookAndFeel(...) method which temporary removes keys from the UIDefaults. While the keys are removed our component tries to create sub-components and fails.

Related code line from FormLAF.useDesignerLookAndFeel:
  defaults.keySet().removeAll(netbeansDefaults.keySet());

The issue also occurs with NetBeans 6.9.

Thanks,
Wolfgang
Comment 1 Jan Stola 2011-04-26 14:53:27 UTC
I was able to reproduce this issue with the latest NetBeans build. It seems to be caused by the fact that JYTabbedPane modifies UIDefaults when a new tab is added. Our look and feel-related hacks do not expect this. The relevant stacktrace is

javax.swing.UIDefaults.put(UIDefaults.java:329)
o.n.m.form.FormLAF$DelegatingDefaults.put(FormLAF.java:725)
org.jdesktop.swingx.plaf.LookAndFeelAddons.loadDefaults
  (LookAndFeelAddons.java:140)
org.jdesktop.swingx.plaf.AbstractComponentAddon.initialize
  (AbstractComponentAddon.java:51)
org.jdesktop.swingx.plaf.LookAndFeelAddons.contribute
  (LookAndFeelAddons.java:260)
de.javasoft.synthetica.addons.SyntheticaAddons.contribute
  (SyntheticaAddons.java:212)
de.javasoft.swing.JYLabel.<clinit>(JYLabel.java:38)
de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI.addTab
  (BasicJYTabbedPaneUI.java:1029)
de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI.access$17
  (BasicJYTabbedPaneUI.java:1021)
de.javasoft.swing.plaf.basic.BasicJYTabbedPaneUI$4.propertyChange
  (BasicJYTabbedPaneUI.java:809)
java.beans.PropertyChangeSupport.firePropertyChange
  (PropertyChangeSupport.java:339)
java.beans.PropertyChangeSupport.firePropertyChange
  (PropertyChangeSupport.java:276)
java.awt.Component.firePropertyChange(Component.java:8132)
de.javasoft.swing.JYTabbedPane.firePropertyChange(JYTabbedPane.java:1345)
de.javasoft.swing.JYTabbedPane.insertTab(JYTabbedPane.java:386)
o.n.m.form.layoutsupport.delegates.JTabbedPaneSupport.addComponentsToContainer
  (JTabbedPaneSupport.java:259)
o.n.m.form.layoutsupport.LayoutSupportManager.addComponents
  (LayoutSupportManager.java:538)
o.n.m.form.FormModel.addVisualComponent(FormModel.java:459)
o.n.m.form.MetaComponentCreator.addVisualComponent2
  (MetaComponentCreator.java:978)
o.n.m.form.MetaComponentCreator.addPrecreatedComponent
  (MetaComponentCreator.java:363)
o.n.m.form.HandleLayer$NewComponentDrag.end(HandleLayer.java:3145)
o.n.m.form.HandleLayer$ComponentDrag.end(HandleLayer.java:2479)
o.n.m.form.HandleLayer.endDragging(HandleLayer.java:1263)
o.n.m.form.HandleLayer.mousePressed(HandleLayer.java:1954)
...
Comment 2 Jan Stola 2011-04-26 15:07:02 UTC
Fixed - addPrecreatedComponent() uses FormLAF block by now.

Modified file: http://hg.netbeans.org/jet-main/rev/59ef92f67af6