import java.util.HashMap;
import java.util.Stack;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
public class Main extends Box {
public Main() {
super(BoxLayout.Y_AXIS);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
for (int i = 0; i < 14; i++) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode("Root" + i);
node.add(new DefaultMutableTreeNode("Child" + i));
root.add(node);
}
CustomTree tree = new CustomTree(root);
tree.setRootVisible(false);
JScrollPane pane = new JScrollPane(tree);
add(pane);
JButton button = new JButton("Expand");
button.addActionListener(e-> tree.expandSelectedPaths());
add(button);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new Main());
frame.validate();
frame.pack();
frame.setVisible(true);
}
}
class CustomTree extends JTree {
HashMap expandedState = new HashMap();
Stack s = new Stack();
public CustomTree(DefaultMutableTreeNode root) {
super(root);
}
public void expandSelectedPaths() {
TreePath[] paths = getSelectionPaths();
if(paths == null || paths.length == 0){
return;
}
setSelectionPath(paths[0]);
for (TreePath path : paths) {
TreePath parentPath = path.getParentPath();
while (parentPath != null) {
if (isExpanded(parentPath)) {
parentPath = null;
} else {
s.push(parentPath);
parentPath = parentPath.getParentPath();
}
}
for (int i = s.size() - 1; i >= 0; i--) {
parentPath = s.pop();
if (!isExpanded(parentPath)) {
expandedState.put(parentPath, Boolean.TRUE);
}
}
}
if (accessibleContext != null) {
((AccessibleJTree) accessibleContext).fireVisibleDataPropertyChange();
}
for (TreePath path : paths) {
fireTreeExpanded(path);
try {
fireTreeWillExpand(path);
} catch (Exception eve) {
return;
}
}
}
}