{"record":{"id":"3b4c55ce846ef0ef","repo":"JetBrains/intellij-community","slug":"string-descriptor-value-required-3b4c55","errorCode":null,"errorMessage":"String descriptor value required","messagePattern":"String descriptor value required","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"java/compiler/forms-compiler/src/com/intellij/uiDesigner/lw/LwTabbedPane.java","lineNumber":34,"sourceCode":"    return null;\n  }\n\n  @Override\n  public void read(final Element element, final PropertiesProvider provider) throws Exception {\n    readNoLayout(element, provider);\n  }\n\n  @Override\n  protected void readConstraintsForChild(final Element element, final LwComponent component) {\n    final Element constraintsElement = LwXmlReader.getRequiredChild(element, UIFormXmlConstants.ELEMENT_CONSTRAINTS);\n    final Element tabbedPaneChild = LwXmlReader.getRequiredChild(constraintsElement, UIFormXmlConstants.ELEMENT_TABBEDPANE);\n\n    final StringDescriptor descriptor = LwXmlReader.getStringDescriptor(tabbedPaneChild,\n                                                                        UIFormXmlConstants.ATTRIBUTE_TITLE,\n                                                                        UIFormXmlConstants.ATTRIBUTE_TITLE_RESOURCE_BUNDLE,\n                                                                        UIFormXmlConstants.ATTRIBUTE_TITLE_KEY);\n    if (descriptor == null) {\n      throw new IllegalArgumentException(\"String descriptor value required\");\n    }\n    final Constraints constraints = new Constraints(descriptor);\n\n    final Element tooltipElement = LwXmlReader.getChild(tabbedPaneChild, UIFormXmlConstants.ELEMENT_TOOLTIP);\n    if (tooltipElement != null) {\n      constraints.myToolTip = LwXmlReader.getStringDescriptor(tooltipElement,\n                                                              UIFormXmlConstants.ATTRIBUTE_VALUE,\n                                                              UIFormXmlConstants.ATTRIBUTE_RESOURCE_BUNDLE,\n                                                              UIFormXmlConstants.ATTRIBUTE_KEY);\n    }\n\n    String icon = tabbedPaneChild.getAttributeValue(UIFormXmlConstants.ATTRIBUTE_ICON);\n    if (icon != null) {\n      constraints.myIcon = new IconDescriptor(icon);\n    }\n    icon = tabbedPaneChild.getAttributeValue(UIFormXmlConstants.ATTRIBUTE_DISABLED_ICON);\n    if (icon != null) {\n      constraints.myDisabledIcon = new IconDescriptor(icon);","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/JetBrains/intellij-community/blob/be881553f2a76ac8b4ea53950d93f0de78295c19/java/compiler/forms-compiler/src/com/intellij/uiDesigner/lw/LwTabbedPane.java#L16-L52","documentation":"Thrown by LwTabbedPane.readConstraintsForChild when a tabbed-pane child's title StringDescriptor is null: LwXmlReader.getStringDescriptor over the title/title-resource-bundle/title-key attributes produced nothing. Every component placed in a JTabbedPane must carry a tab title (plain value or localized bundle+key), so a null descriptor is an IllegalArgumentException.","triggerScenarios":"A component inside <tabbed-pane> has <constraints><tabbedPane/> with none of the title attributes present, e.g. <tabbedPane icon=\"...\"/> without title, title-resource-bundle, or title-key. getStringDescriptor returns null and the read fails.","commonSituations":"Hand-edited or generated form XML omitting tab titles; migration scripts converting forms that drop title attributes; older designer versions writing titles differently than the reader expects.","solutions":["Add a title attribute (or title-resource-bundle + title-key pair) to the <tabbedPane> constraints element of the child.","Re-open the form in the GUI designer, select the tab, set its title, and save.","If tabs intentionally have no text, still set an empty title value attribute (title=\"\") so the descriptor is non-null."],"exampleFix":"<!-- before -->\n<constraints><tabbedPane/></constraints>\n\n<!-- after -->\n<constraints><tabbedPane title=\"General\"/></constraints>","handlingStrategy":"validation","validationCode":"// When writing tabbed-pane constraints, always include a title or bundle+key\nif (title == null && (titleBundle == null || titleKey == null)) throw new IllegalStateException(\"tabbedPane constraints require a title\");","typeGuard":null,"tryCatchPattern":"try { tabbedPane.readConstraintsForChild(element, component); } catch (IllegalArgumentException e) { if (\"String descriptor value required\".equals(e.getMessage())) { /* add title attribute to <tabbedPane> constraints */ } else throw e; }","preventionTips":["Give every tab a title in the designer, even an empty string if no text is wanted.","For localized apps, use title-resource-bundle + title-key consistently."],"tags":["gui-designer","form-xml","tabbed-pane","string-descriptor"],"backgroundTag":null,"analyzedSha":"be881553f2a76ac8b4ea53950d93f0de78295c19","analyzedAt":"2026-08-14T14:13:06.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}