TreeViewer (JFace) Items bearbeiten?

Martakus

Grünschnabel
Hallo ich hab ein Problem,
und zwar möchte ich in einem TreeViewer (JFace) die Items bearbeiten. Das soll folgendermaßen aussehen. Ich möchte ein Doppelklick auf ein Element machen und dann soll ich den Itemtext bearbeiten können IM TreeViewer. Ähnlich wie zum Windows Explorer, wenn ich auf eine Datei rechtsklick mache -> Umbenennen. Bloß halt mit Doppelklick.
Kann mir da jemand helfen?
 
Habs nicht getestet, aber damit müsste es doch gehen:

Java:
		treeViewer.addDoubleClickListener(new IDoubleClickListener(){
			public void doubleClick(DoubleClickEvent event){
				TreeSelection ts = (TreeSelection)event.getSelection();
				System.out.println(ts.getFirstElement());
			}
		});

Danach müsstest du ts auf den entsprechenden Typ casten können und für diesen dann den Namen ändern können.
Das ganze ist nicht 100% ausgereift aber sollte dir mal nen deut in die richtige Richtung geben.

Gruss Ben
 
Damit bekomm ich ja nur die Daten aus dem Tree die Selektiert sind wenn ich drauf Doppelklicke, aber ich kann sie nicht IM!! Tree bearbeiten so wie im Windows Explorer. So könnte ich die ja z.B. nur in einer extra TextControll bearbeiten, aber das will ich ja nicht.
 
Eine allroundfunktion für das von dir Gewünscht kenne ich leider nicht, ich kann dir nur Tipps für die Umsetzung geben...

Vielleicht weiß ja jemand anderes eine bessere Möglichkeit
 
Hallo,

hier mal ein Beispiel für In-Place Editing eines Baum Elements mit einem JFace TreeViewer per Doppelklick oder F2.

schau mal hier:
Java:
package de.tutorials;

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

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.TreeViewerEditor;
import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class JFaceTreeViewerExample extends ApplicationWindow {

    public JFaceTreeViewerExample(Shell parentShell) {
        super(parentShell);
        setBlockOnOpen(true);
        open();
    }

    protected Control createContents(Composite parent) {
        final TreeViewer treeViewer = createTreeVewer(parent);
        treeViewer.setInput(initModel());
        return super.createContents(parent);
    }

    private TreeViewer createTreeVewer(Composite parent) {
        final TreeViewer treeViewer = new TreeViewer(parent);
        treeViewer.setContentProvider(new DefaultTreeContentProvider());
        treeViewer.setLabelProvider(new LabelProvider());

        treeViewer.getTree().setLinesVisible(true);
        treeViewer.getTree().setHeaderVisible(true);

        TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(
                treeViewer, new FocusCellOwnerDrawHighlighter(treeViewer));

        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
                treeViewer) {
            protected boolean isEditorActivationEvent(
                    ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };

        TreeViewerEditor.create(treeViewer, focusCellManager, actSupport,
                ColumnViewerEditor.TABBING_HORIZONTAL
                        | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                        | ColumnViewerEditor.TABBING_VERTICAL
                        | ColumnViewerEditor.KEYBOARD_ACTIVATION);

        final TextCellEditor textCellEditor = new TextCellEditor(treeViewer
                .getTree());

        TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.NONE);
        column.getColumn().setWidth(300);
        column.getColumn().setMoveable(true);
        column.getColumn().setText("Name");
        column.setLabelProvider(new ColumnLabelProvider());
        column.setEditingSupport(new EditingSupport(treeViewer) {
            protected boolean canEdit(Object element) {
                return true;
            }

            protected CellEditor getCellEditor(Object element) {
                return textCellEditor;
            }

            protected Object getValue(Object element) {
                if (element instanceof Named) {
                    return ((Named) element).getName();
                }
                return element.toString();
            }

            protected void setValue(Object element, Object value) {
                if (element instanceof Named) {
                    ((Named) element).setName(String.valueOf(value));
                }
                treeViewer.update(element, null);
            }
        });

        treeViewer.getTree().addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.keyCode == SWT.F2) {
                    // TODO find right column...
                    treeViewer.editElement(((IStructuredSelection) treeViewer
                            .getSelection()).getFirstElement(), 0);
                }
            }
        });
        return treeViewer;
    }

    static class DefaultTreeContentProvider implements ITreeContentProvider {
        @Override
        public Object getParent(Object element) {
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            if (element == null)
                return false;
            if (element instanceof Disc) {
                return !((Disc) element).getTracks().isEmpty();
            }
            return false;
        }

        final static Object[] EMPTY = new Object[0];

        @Override
        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof List) {
                return ((List) parentElement).toArray();
            } else if (parentElement instanceof Disc) {
                return ((Disc) parentElement).getTracks().toArray();
            }
            return EMPTY;
        }

        @Override
        public Object[] getElements(Object inputElement) {
            return getChildren(inputElement);
        }

        @Override
        public void dispose() {

        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

        }
    }

    private List<Disc> initModel() {

        List<Disc> compactDiscs = new ArrayList<Disc>();
        for (int i = 0; i < 3; i++) {
            Disc compactDisc = new Disc("cd name " + i);
            for (int j = 0; j < 10; j++) {
                Track t = new Track("track " + j, j * j, compactDisc);
                compactDisc.addTrack(t);
            }
            compactDiscs.add(compactDisc);
        }

        return compactDiscs;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        new JFaceTreeViewerExample(shell);
    }

    static interface Named {
        String getName();

        void setName(String name);
    }

    static class Disc implements Named {
        String name;

        List<Track> tracks;

        public Disc(String name) {
            this.name = name;
            tracks = new ArrayList<Track>();
        }

        public boolean addTrack(Track o) {
            return tracks.add(o);
        }

        public List<Track> getTracks() {
            return tracks;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return name;
        }

        @Override
        public void setName(String name) {
            this.name = name;
        }
    }

    static class Track implements Named {
        private String name;
        private int length; // in seconds
        private Disc associatedCompactDisc;

        public Track(String name, int length, Disc associatedCompactDisc) {
            this.associatedCompactDisc = associatedCompactDisc;
            this.length = length;
            this.name = name;
        }

        public Disc getAssociatedCompactDisc() {
            return associatedCompactDisc;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return name;
        }

        @Override
        public void setName(String name) {
            this.name = name;
        }

    }
}

Gruß Tom
 
Hallo,

entschuldigung für daas Ausgraben dieses Themas,

aber ich habe gerade ein Problem.

Ich habe anhand dieses Beispiels, einen TreeViewer mit zwei Columns erstellt bei dem die zweite Column mit CellEditoren versorgt wird. Es funktioniert auch alles einwandfrei außer in dem Falle das mein TreeViewer nur ein Element enhält also:


-------------------------
| Element | Value |
-------------------------

Klicke ich jetzt auf Element oder Auf Value soll der Cell Editor angehen, was auch problemlos klappt wenn mehr als ein Element mit Value angezeigt wird.


Bei einem Element erhalte ich folgenden StackTrace:


------------------------

eclipse.buildId=M20090917-0800
java.version=1.6.0_17
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE
Framework arguments: -product org.eclipse.platform.ide
Command-line arguments: -product org.eclipse.platform.ide -data C:\XXXX/../runtime-EclipseApplication -dev file:C:/XXXXX/.metadata/.plugins/org.eclipse.pde.core/Eclipse Application/dev.properties -os win32 -ws win32 -arch x86 -console -clean

!ENTRY org.eclipse.jface 4 2 2010-03-01 13:35:44.944
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface".
!STACK 0
java.lang.ClassCastException: org.eclipse.swt.widgets.Tree cannot be cast to org.eclipse.swt.widgets.TreeItem
at org.eclipse.jface.viewers.TreeViewer.getViewerRowFromItem(TreeViewer.java:785)
at org.eclipse.jface.viewers.ColumnViewer.editElement(ColumnViewer.java:434)
at org.eclipse.jface.viewers.TreeViewer.editElement(TreeViewer.java:1148)
at com.XXXXXX.configView.ConfigView$3.run(ConfigView.java:171)
at com.XXXXXX.configView.ConfigView$2.selectionChanged(ConfigView.java:120)
at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.runtime.Platform.run(Platform.java:888)
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160)
at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2132)
at org.eclipse.jface.viewers.StructuredViewer.handleSelect(StructuredViewer.java:1160)
at org.eclipse.jface.viewers.StructuredViewer$4.widgetSelected(StructuredViewer.java:1190)
at org.eclipse.jface.util.OpenStrategy.fireSelectionEvent(OpenStrategy.java:228)
at org.eclipse.jface.util.OpenStrategy.access$4(OpenStrategy.java:222)
at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:389)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
at org.eclipse.equinox.launcher.Main.main(Main.java:1287)

---------------------

Irgendwie gibt die Methode getViewerRowFromItem einen Tree zurück anstatt ein TreeItem und der Vorgang schlägt fehl.

Hat jemand vielleicht eine Idee woran das liegen könnte? Ich bin mit meinem Látein am Ende.

Danke auf jedenfall für eure Hilfe!


Benni
 
Ergänzend hier noch der Code meines TreeViewers:

Code:
public class ConfigView extends ViewPart {

	public TreeViewer viewer;
	public static final String ID = "XXXXXXX.ConfigView"; //$NON-NLS-1$
	
	private Action selectionChangedAction;
	private XmlCursor lastsel = null;
	private DetailedView detailedView;

	public ConfigView() {
	}

	/**
	 * Create contents of the view part.
	 * 
	 * @param parent
	 */
	@Override
	public void createPartControl(Composite parent) {
		// make tree view
		viewer = new TreeViewer(parent, SWT.MULTI | SWT.FULL_SELECTION);
		{
			// make element colum of tree view
			TreeViewerColumn treeViewerColumn = new TreeViewerColumn(viewer,
					SWT.NONE);
			TreeColumn treeColumn = treeViewerColumn.getColumn();
			treeColumn.setWidth(300);
			treeColumn.setText("Element");

			// make value column of tree view
			TreeViewerColumn treeViewerColumn2 = new TreeViewerColumn(viewer,
					SWT.NONE);
			TreeColumn treeColumn2 = treeViewerColumn2.getColumn();
			treeColumn2.setWidth(300);
			treeColumn2.setText("Value");

			// adding editingsupport to the column
			treeViewerColumn2.setEditingSupport(new ConfigViewEditingSupport(
					viewer, 2, this));

			// making the activation strategy for the editors
			TreeViewerEditor.create(viewer,
					new ColumnViewerEditorActivationStrategy(viewer),
					ColumnViewerEditor.DEFAULT);

			// making cellFocus manger that reacts on key, mouse etc.
			TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(
					viewer, new FocusCellOwnerDrawHighlighter(viewer));

			// activation strategy for editor in cell which events he react
			ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
					viewer) {
				protected boolean isEditorActivationEvent(
						ColumnViewerEditorActivationEvent event) {
					return event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
				}
			};

			// create the editors with defined cellmanger and activation
			// strategy
			TreeViewerEditor.create(viewer, focusCellManager, actSupport,
					TreeViewerEditor.DEFAULT);

		}
		// configurate tree
		viewer.getTree().setHeaderVisible(true);
		viewer.getTree().setLinesVisible(true);
		// set content provider
		viewer.setContentProvider(new ConfigViewContentProvider());
		// set label provider
		viewer.setLabelProvider(new ConfigViewLabelProvider());

		// add selection changed listener
		viewer.addSelectionChangedListener(new ISelectionChangedListener() {

			@Override
			public void selectionChanged(SelectionChangedEvent event) {
				selectionChangedAction.run();
			}
		});

		// define action
		selectionChangedAction = new Action() {
			public void run() {
				XmlCursor cursor = (XmlCursor) ((IStructuredSelection) viewer
						.getSelection()).getFirstElement();

				if (detailedView == null) {

					// getting detailed view
					try {
						detailedView = (DetailedView) PlatformUI
								.getWorkbench()
								.getActiveWorkbenchWindow()
								.getActivePage()
								.showView("XXXXXX.DetailView");
					} catch (PartInitException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
				if (lastsel == null) {

				viewer.editElement(((IStructuredSelection) viewer.getSelection()).getFirstElement(), 1);

				}

				} else if (((IStructuredSelection) viewer.getSelection()).getFirstElement()= null) {
					if (!((IStructuredSelection) viewer.getSelection()).getFirstElement().equals(lastsel)) {
						viewer.editElement(((IStructuredSelection) viewer.getSelection()).getFirstElement(), 1);
					}
				}

			};
	}

	/**
	 * Create the actions.
	 */
	private void createActions() {
		// Create the actions
	}

	/**
	 * Initialize the toolbar.
	 */
	private void initializeToolBar() {
		IToolBarManager toolbarManager = getViewSite().getActionBars()
				.getToolBarManager();
	}

	/**
	 * Initialize the menu.
	 */
	private void initializeMenu() {
		IMenuManager menuManager = getViewSite().getActionBars()
				.getMenuManager();
	}

	@Override
	public void setFocus() {
		// Set the focus
	}
}
 
Hi,

auf den Code von Thomas Darimont hab ich ein paar Fragen.

den TreeViewerColumn, kann ich es irgendwie erreichen, dass die die Colum die gesamte Viewbreite nutzt? Ich hab nur eine Spalte, wäre gut wenn die den ganzen Raum ausfüllen würde.

dann als zweite Frage, kann dieser TreeEditorViewer keine mehrfach Selektion? Das krieg ich bei mir nicht aktiviert?
 

Neue Beiträge

Zurück