JComponent () { if (myComponent != null) { SwingUtilities.updateComponentTreeUI(myComponent); return myComponent; } DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(null); DefaultTreeModel treeModel = new DefaultTreeModel(rootNode); myTree = createTree(treeModel); enableDnD(); JScrollPane treePaneScroll = ScrollPaneFactory.createScrollPane(myTree); JComponent promoter = createPromoter(); if (promoter != null ) { JPanel contentAndPromoter = new JPanel(); contentAndPromoter.setLayout(new BoxLayout(contentAndPromoter, BoxLayout.Y_AXIS)); contentAndPromoter.add(treePaneScroll); contentAndPromoter.add(promoter); myComponent = contentAndPromoter; } else { myComponent = treePaneScroll; } if (Registry.is("error.stripe.enabled")) { ErrorStripePainter painter = new ErrorStripePainter(true); Disposer.register(this, new TreeUpdater<>(painter, treePaneScroll, myTree) { @Override protected void update(ErrorStripePainter painter, int index, Object object) { if (object instanceof DefaultMutableTreeNode node) { object = node.getUserObject(); } super.update(painter, index, getStripe(object, myTree.isExpanded(index))); } }); } myTreeStructure = createStructure(); myAsyncSupport = new AsyncProjectViewSupport(this, myProject, myTreeStructure, createComparator()); configureAsyncSupport(myAsyncSupport); myAsyncSupport.setModelTo(myTree); initTree(); Disposer.register(this, UiNotifyConnector.installOn(myTree, new Activatable() { private boolean showing; @Override public void showNotify() { if (!showing) { showing = true; restoreExpandedPaths(); } } @Override public void hideNotify() { if (showing) { showing = false; saveExpandedPaths(); } } })); return myComponent; }