import javax.swing.tree.*;
static JTree jDynamicTree(final A root, final F1> makeChildren) {
ret swing(func -> JTree {
DefaultMutableTreeNode rootNode = new(root);
rootNode.add(new DefaultMutableTreeNode(jDynamicTree_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());
if (replaceTreeNodeChildren_withDummyChild(node, l, jDynamicTree_dummy()))
((DefaultTreeModel) tree.getModel()).nodeStructureChanged(node);
}
});
ret tree;
});
}