# TreeViewer in SWT: Default Selection eines Items



## robb (1. Sep 2008)

Hiho,

ich erstelle gerade eine GUI mit einem TreeViewer in SWT und möchte in diesem TreeViewer nachdem er initialisiert wurde das letzte Element defaultmässig anwählen. 
Ich habe schon versucht mir nun mithilfe von "ivTreeViewerElements.getTree().setSelection(TreeItem ti)" das richtige Element auszuwählen, nur leider konnte ich es bisher nur manuell auswählen.

Falls jemand ne Lösung hat wäre ich sehr dankbar, wenn ers hier posten würde 

Gruss Robb


```
(...)
        // Widgets
	private TreeViewer ivTreeViewerElements;
        (...)
        protected void initGUI(final Composite canvas) throws Exception {
		(...)
		ivTreeViewerElements = new TreeViewer(canvas, SWT.SINGLE);
		ivTreeViewerElements.setContentProvider(new TreeContentProvider());
                (...)
        }

        private class TreeContentProvider implements ITreeContentProvider {

		/**
		 * Gets the Children for the Treeviewer
		 */
		public Object[] getChildren(Object parentElement) {
			return ((TreeNode) parentElement).getChildren().toArray();
		}

		/**
		 * Gets the Parents for the Treeviewer
		 */
		public Object getParent(Object element) {
			return ((TreeNode) element).getParent();
		}

		/**
		 * Are there Children
		 */
		public boolean hasChildren(Object element) {
			return ((TreeNode) element).getChildren().size() > 0;
		}

		/**
		 * Get all Elements
		 */
		public Object[] getElements(Object inputElement) {
			return ((TreeNode) inputElement).getChildren().toArray();
		}

		public void dispose() {
			// nothing to do
		}

		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
			// nothing to do
		}

	}

	/**
	 * Method to build up the Treeviewer RootNode
	 * 
	 * @param pvListThrow
	 *           List which will be shown in the treeviewer
	 * @return Input for the treeviewer
	 */
	private TreeNode getRootNode(List<Throwable> pvListThrow) {
		TreeNode lvRoot = new TreeNode(ivSelection.getListElements().get(0));
		TreeNode lvChildren = lvRoot;
		TreeNode lvChildrenNext;

		for (int i = 0; i < ivSelection.getListElements().size(); i++) {
			Throwable lvThrow = ivSelection.getListElements().get(i);
			lvChildrenNext = new TreeNode(lvThrow);
			lvChildren.addChild(lvChildrenNext);
			lvChildren = lvChildrenNext;
		}

		return lvRoot;
	}

	/**
	 * Private Class for the treeviewer. Basic object for a treenode is the
	 * Throwable Object.
	 * 
	 * @author x1rschilling
	 * 
	 */
	class TreeNode {
		private Throwable ivThrowable;

		private List<TreeNode> ivChildren = new ArrayList<TreeNode>();

		private TreeNode ivParent;

		/**
		 * Constructs a new Node
		 * 
		 * @param t
		 *           Throwable for the Treeviewer
		 */
		public TreeNode(Throwable t) {
			ivThrowable = t;
		}

		/**
		 * Gets the Parent node.
		 * 
		 * @return Parent node
		 */
		protected Object getParent() {
			return ivParent;
		}

		/**
		 * Adds a Child to the Node
		 * 
		 * @param pvChild
		 *           node which will be added to this node
		 * @return new node with the added node
		 */
		public TreeNode addChild(TreeNode pvChild) {
			ivChildren.add(pvChild);
			pvChild.ivParent = this;
			return this;
		}

		/**
		 * Gets the children of the node
		 * 
		 * @return List of treenodes with the children
		 */
		public List<TreeNode> getChildren() {
			return ivChildren;
		}

		/**
		 * Gets the Data in the node
		 * 
		 * @return Throwable object
		 */
		public Throwable getData() {
			return ivThrowable;
		}

		/**
		 * toString Method to get the Name
		 */
		public String toString() {
			return ivThrowable.getClass().getName();
		}
	}
```


----------



## Wildcard (1. Sep 2008)

Eine seltsame Konstruktion hast du da...
Normalerweise verwendet man die ContentProvider/LabelProvider um direkt das DomainModel für den Viewer zu 'übersetzen', aber du hast mit der TreeNode noch eine zusätzliche Zwischenschicht.
Statt


> ivTreeViewerElements.getTree().setSelection(TreeItem ti)




```
treeView.setSelection(new StructuredSelection(domainModelElement),true);
```


----------



## robb (2. Sep 2008)

Heyho,

wenn ich den Methodenaufruf vom TreeView mit meinem domainModelElement, in diesem Fall mein TreeNode, fülle wird bei mir trotzdem nichts vorselektiert in dem TreeView.



> ```
> treeView.setSelection(new StructuredSelection(domainModelElement),true);
> ```



Ich könnte natürlich auch statt dem Datenmodel "TreeNode" die TreeItems nutzen nur hatte ich bei den TreeItems dasselbe Problem mit der Vorauswahl von Treeelementen und dem automatischen expandieren beim Starten der Anwendung.

Gruss

Robb


----------



## robb (2. Sep 2008)

Okay, das Problem ist gelöst. Ich hab keinen Fokus auf meinem Tree gehabt, deswegen wurde auch nichts ausgewählt.

Danke für die Hilfe!


----------

