Java tutorial
import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; public class Main extends JFrame { public static void main(String[] args) { new Main(5); } public Main(int n) { setDefaultCloseOperation(EXIT_ON_CLOSE); Container content = getContentPane(); JTree tree = new JTree(new OutlineNode(1, n)); content.add(new JScrollPane(tree), BorderLayout.CENTER); setSize(300, 475); setVisible(true); } } class OutlineNode extends DefaultMutableTreeNode { boolean areChildrenDefined = false; int outlineNum; int numChildren; public OutlineNode(int outlineNum, int numChildren) { this.outlineNum = outlineNum; this.numChildren = numChildren; } @Override public boolean isLeaf() { return false; } @Override public int getChildCount() { if (!areChildrenDefined) { defineChildNodes(); } return super.getChildCount(); } private void defineChildNodes() { areChildrenDefined = true; for (int i = 0; i < numChildren; i++) { add(new OutlineNode(i + 1, numChildren)); } } @Override public String toString() { TreeNode parent = getParent(); if (parent == null) { return String.valueOf(outlineNum); } else { return parent.toString() + "." + outlineNum; } } }