0

Select first item in Tree B, upon selecting something in Tree A

asked 2012-10-23 09:52:27 +0800

Beren77 gravatar image Beren77
9

updated 2012-10-23 09:52:50 +0800

Hi,

I have two trees (A and B).
B is created (!), once the selection in A changes and I use two different AbstractTreeModels for both trees.

Now, I'd like to select the first item in (the newly created) tree B, once the selection in A changes.
However, at this point, tree B does not have any tree items which I could render.

I found this post: http://www.zkoss.org/forum/listComment/9809

But the solution there does not work for me, as the first child of my tree (B) is Treecols (and that again has Treecol, which does not have any kids).

So -- how can I send a "render now!" to tree B in order to select the first item?

Thanks!
Philipp

delete flag offensive retag edit

4 Replies

Sort by ยป oldest newest

answered 2012-10-24 03:43:03 +0800

jj gravatar image jj
638 3

Yes, the first child of your tree would be treecols. You should use tree.getTreeChildren() or tree.getItems(), then follow the correct hierarchy to retrieve the first Treeitem, and set it selected.

link publish delete flag offensive edit

answered 2012-10-24 07:19:25 +0800

Beren77 gravatar image Beren77
9

updated 2012-10-24 07:21:33 +0800

But if I use getTreechildren() or getItems(), the result is always null at this point...

Here's my code fragment:

  // tree is "Tree A" in my description and we are in the Selection change event listener.
  // structureTree is "Tree B".
  // treeCell is the currently rendered cell in my TreeRenderer for "Tree A"
  treeCell.addEventListener(Events.ON_CLICK, new EventListener<Event>(){
    @Override
    public void onEvent(Event event) throws Exception {					
      final Tree structureTree = (Tree) tree.getParent().getFellow("structureTree");
      structureTree.setModel(new ProductStructureModel(tree)); 
      structureTree.setVisible(true);
      Treechildren treeChildren = structureTree.getTreechildren();
      if (treeChildren != null) { // treeChildren is always null at this point.
        Collection <Treeitem> items = treeChildren.getItems();
        if (items != null && !items.isEmpty()) {
          structureTree.selectItem(items.iterator().next());
        }
      }
    }
  });

So -- what am I missing?? Thanks!
Philipp

link publish delete flag offensive edit

answered 2012-10-29 08:17:20 +0800

Beren77 gravatar image Beren77
9

Can I provide more information? My tree model actually _does_ provide data for Tree B; it is rendered correctly, but I cannot access the tree items at this point. Anyone has an idea? Thanks!

link publish delete flag offensive edit

answered 2012-11-06 06:57:10 +0800

benbai gravatar image benbai
2228 6
http://www.zkoss.org

Hi Beren77,

The treeitem will not be rendered until you open its parent node, you can control the selection by model directly, for example:

zul

<zk>
	<window apply="test.TestComposer">
		<tree id="treeA">
			<treechildren>
				<treeitem label="select 2.1" />
				<treeitem label="select 3.2.2" />
			</treechildren>
		</tree>
		<tree id="treeB" />
	</window>
</zk>

composer

package test;

import java.util.ArrayList;
import java.util.List;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.SelectEvent;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.DefaultTreeModel;
import org.zkoss.zul.DefaultTreeNode;
import org.zkoss.zul.Tree;
import org.zkoss.zul.TreeModel;
import org.zkoss.zul.TreeNode;
import org.zkoss.zul.Treecell;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.TreeitemRenderer;
import org.zkoss.zul.Treerow;
import org.zkoss.zul.ext.Selectable;

public class TestComposer extends GenericForwardComposer {
	Tree treeB;
	TreeModel _model;
	public void doAfterCompose (Component comp) throws Exception {
		super.doAfterCompose(comp);
		treeB.setModel(getModel());
		treeB.setItemRenderer(new InfoRenderer());
	}
	public void onSelect$treeA(SelectEvent event) {
		String toSelect = ((Treeitem)event.getReference()).getLabel().replace("select ", "");
		System.out.println(toSelect);
		DefaultTreeNode root = (DefaultTreeNode)treeB.getModel().getRoot();
		List<DefaultTreeNode> nodes = (List<DefaultTreeNode>)root.getChildren();
		List<DefaultTreeNode> nextLevelNodes = new ArrayList<DefaultTreeNode>();
		if (nodes != null && nodes.size() > 0) {
			while (nodes.size() > 0) {
				int size = nodes.size();
				for (int i = 0; i < size; i++) {
					DefaultTreeNode node = nodes.get(i);
					System.out.println("node is " + node.getData());
					if (node != null) {
						if (toSelect.equals(node.getData())) {
							((DefaultTreeModel)_model).addToSelection(node);
							System.out.println(" found equals");
							TreeNode parent = node.getParent();
							while(parent != null) {
								((DefaultTreeModel)_model).addOpenObject(parent);
								parent = parent.getParent();
							}
							nodes.clear();
							break;
						}
						if (node.getChildren() != null
							&& node.getChildren().size() > 0) {
							System.out.println(node.getChildren());
							nextLevelNodes.addAll(node.getChildren());
						}
					}
				}
				nodes = nextLevelNodes;
				nextLevelNodes = new ArrayList<DefaultTreeNode>();
			}
		}
	}
	public TreeModel getModel () {
		if (_model == null) {
			_model = new DefaultTreeModel(
				new DefaultTreeNode(null,
						new DefaultTreeNode[] {
						new DefaultTreeNode("1"),
						new DefaultTreeNode("2", new DefaultTreeNode[] {
								new DefaultTreeNode("2.1"),
								new DefaultTreeNode("2.2")
							}
						),
						new DefaultTreeNode("3", new DefaultTreeNode[] {
								new DefaultTreeNode("3.1"),
								new DefaultTreeNode("3.2", new DefaultTreeNode[] {
										new DefaultTreeNode("3.2.1"),
										new DefaultTreeNode("3.2.2")
									}
								)
							}
						)
					}
				)
			);
			((Selectable)_model).setMultiple(true);
		}
		return _model;
	}
	class InfoRenderer implements TreeitemRenderer<DefaultTreeNode<String>> {
	    public void render(Treeitem item, DefaultTreeNode<String> data, int index) throws Exception {
	        String str = data.getData();
	        Treerow tr = new Treerow();
	        item.appendChild(tr);
	        tr.appendChild(new Treecell(str));
	    }
	}
}

Regards,
Ben

link publish delete flag offensive edit
Your reply
Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

[hide preview]

Question tools

Follow

RSS

Stats

Asked: 2012-10-23 09:52:27 +0800

Seen: 151 times

Last updated: Nov 06 '12

Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More