package zk.support.treeerror; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.select.SelectorComposer; import org.zkoss.zk.ui.select.annotation.Listen; import org.zkoss.zk.ui.select.annotation.Wire; import org.zkoss.zul.DefaultTreeModel; import org.zkoss.zul.DefaultTreeNode; import org.zkoss.zul.Tree; public class TreeModelInconsistencyComposer extends SelectorComposer { @Wire Tree tree; private DefaultTreeModel model; @Override public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); DefaultTreeNode root = new DefaultTreeNode<>("root", Arrays.asList( new DefaultTreeNode("Node 1", Arrays.asList( new DefaultTreeNode("1.1"), new DefaultTreeNode("1.2") )), new DefaultTreeNode("Node 2", Arrays.asList( new DefaultTreeNode("2.1"), new DefaultTreeNode("2.2") )), new DefaultTreeNode("Node 3", Arrays.asList( new DefaultTreeNode("2.1"), new DefaultTreeNode("2.2") )), new DefaultTreeNode("Node 4", Arrays.asList( new DefaultTreeNode("2.1"), new DefaultTreeNode("2.2") )), new DefaultTreeNode("Node 5", Arrays.asList( new DefaultTreeNode("3.1"), new DefaultTreeNode("3.2") )) ) ); model = new DefaultTreeModel<>(root); model.setMultiple(true); tree.setModel(model); } @Listen("onClick=#removeButton") public void removeNode() { String openPathsBefore = logPaths(model.getOpenPaths()); String openObjectsBefore = model.getOpenObjects().toString(); model.getRoot().getChildren().remove(0); String openPathsAfter = logPaths(model.getOpenPaths()); String openObjectsAfter = model.getOpenObjects().toString(); System.out.println("Open paths before: " + openPathsBefore); System.out.println("Open objects before: " + openObjectsBefore); System.out.println("Open paths after: " + openPathsAfter); System.out.println("Open objects after: " + openObjectsAfter); } public String logPaths(int[][] paths) { List pathTexts = new ArrayList<>(); for(int i = 0; i < paths.length; i++) { pathTexts.add(Arrays.toString(paths[i])); } return pathTexts.toString(); } }