import javax.swing.tree.*; // dummy text you can use as a temporary child for a lazy-filled node sS jDynamicTree2_dummy = new String(""); static JTree jDynamicTree2(final A root, final F1> makeChildren) { ret swing(func -> JTree { DefaultMutableTreeNode rootNode = new(root); rootNode.add(new DefaultMutableTreeNode(jDynamicTree2_dummy)); final JTree tree = new JTree(rootNode); tree.setShowsRootHandles(true); tree.collapseRow(0); tree.addTreeWillExpandListener(new TreeWillExpandListener { public void treeWillCollapse(TreeExpansionEvent e) {} public void treeWillExpand(TreeExpansionEvent e) { DefaultMutableTreeNode node = cast e.getPath().getLastPathComponent(); L l = callF(makeChildren, (A) node.getUserObject()); ret replaceTreeNodeChildren_withDummyChild(node, l, jDynamicTree2_dummy); } }); ret tree; }); }