SWT Eclipse JFace Binding TreeViewer

Andreas29

Bekanntes Mitglied
Hi Leute,

mein Datenmodell sieht folgendermaßen aus:
Band hat einen Namen und 0...n Albem. Jedes Album hat wiederum einen Namen und 0..n Songs. Jeder Song hat ebenfalls einen Namen und eine Länge. Da ich im Moment von einer Band ausgehe, habe ich eine wunderbare Baumstruktur. Die Band als Root, darunter die Alben und darunter die Songs. Soweit so gut. Für jedes Objekt (Band, Album, Song) habe ich mir eine Klasse mit den entsprechenden Eigenschaften angelegt. Auch wunderbar.

Nun möchte ich diese Struktur an einen TreeViewer binden. Dazu habe ich mir folgende Klasse gebaut:
Java:
package de.kba.agrund.experiments.treeviewerbinding.view.part;

import javax.inject.Inject;

import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.IBeanValueProperty;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.property.list.DelegatingListProperty;
import org.eclipse.core.databinding.property.list.IListProperty;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;

import de.kba.agrund.experiments.treeviewerbinding.model.IAlbum;
import de.kba.agrund.experiments.treeviewerbinding.model.IBand;
import de.kba.agrund.experiments.treeviewerbinding.model.ISong;
import de.kba.agrund.experiments.treeviewerbinding.model.impl.AlbumImpl;
import de.kba.agrund.experiments.treeviewerbinding.model.impl.BandImpl;
import de.kba.agrund.experiments.treeviewerbinding.model.impl.SongImpl;

public class BandTreePart {

	private Composite parent;

	@Inject
	public BandTreePart(Composite parent) {
		this.parent = parent;
		buildUI();
	}

	private void buildUI() {
		TreeViewer viewer = new TreeViewer(this.parent, SWT.FULL_SELECTION);
		viewer.setUseHashlookup(true);
		IBand band = buildBand();
		initBinding(band, viewer);

	}

	private void initBinding(IBand band, TreeViewer treeViewer) {
		IBeanValueProperty returnTextPropertyValue = BeanProperties.value(
				IAlbum.class, "albumName");
		IListProperty listProperty = getListProperty();
		ViewerSupport.bind(treeViewer, band, listProperty,
				returnTextPropertyValue);
		IValueProperty
	}

	private IListProperty getListProperty() {
		IListProperty result = new DelegatingListProperty() {

			private IListProperty inputProperty = BeanProperties.list(
					IBand.class, "albums");

			private IListProperty elementChildren = BeanProperties.list(
					IAlbum.class, "songs");

			@Override
			protected IListProperty doGetDelegate(Object source) {
				if (source instanceof IBand) {
					return inputProperty;
				} else if (source instanceof IAlbum) {
					return elementChildren;
				} else {
					return null;
				}
			}
		};
		return result;
	}

	private IBand buildBand() {
		IBand band = new BandImpl();
		band.setBandName("U2");
		IObservableList albumList = buildAlbumList(3);
		band.setAlbums(albumList);
		return band;
	}

	private IObservableList buildAlbumList(int anzAlben) {
		IObservableList albumList = new WritableList();
		for (int i = 1; i <= anzAlben; i++) {
			IAlbum album = buildAlbum(i * 5);
			albumList.add(album);
		}
		return albumList;
	}

	private IAlbum buildAlbum(int anzSong) {
		IAlbum album = new AlbumImpl();
		album.setAlbumName("Album " + (anzSong / 5));
		IObservableList songList = new WritableList();
		for (int i = 0; i < anzSong; i++) {
			ISong song = buildSong(i);
			songList.add(song);
		}
album.setSongs(songList); // Diese Zeile fehlte...
		return album;
	}

	private ISong buildSong(int i) {
		ISong song = new SongImpl();
		song.setSongName("Song " + i);
		song.setLength(i * 60);
		return song;
	}
}

In dem Part werden leider nur die Alben angezeigt, weder die Band als Root-Knoten noch die in den Alben gespeicherten Songs werden angezeigt. Wo liegt mein Fehler?

Danke für jede Hilfe,
Andreas

edit:
Okay, wenn man die Songs den Alben hinzufuegt und einen eigenen LabelProvider schreibt, geht es. Zumindest zeigt er die Alben und die Songs an. Bleiben also 2 Fragen:
1. Warum zeigt er den root Node nicht an?
2. Komme ich um den eigenen LabelProvider herum?
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Für soetwas solltest du wirklich EMF verwenden. Nicht nur das du dir den ganzen geposteten Code und den Code der Modellklassen sparen kannst weil es mit EMF Modellen automatisch funktioniert, du bekommst auch noch die 3 Millionen anderen EMF Features dazu geschenkt.

Band hat einen Namen und 0...n Albem. Jedes Album hat wiederum einen Namen und 0..n Songs. Jeder Song hat ebenfalls einen Namen und eine Länge.
Das ist die einzig relevante Information, der Rest ist Boilerplate Code. Drücke diese Information formal in einem EMF Ecore aus, und du bist fertig. 5 Minuten arbeit.

In Ecore sieht das ganze dann zB so aus:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="music"
nsURI="http://example.org/music" nsPrefix="m">
<eClassifiers xsi:type="ecore:EClass" name="Library"/>
<eClassifiers xsi:type="ecore:EClass" name="Band" eSuperTypes="#//NamedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="albums" upperBound="-1"
eType="#//Album" containment="true" eOpposite="#//Album/band"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Album" eSuperTypes="#//NamedElement">
<eStructuralFeatures xsi:type="ecore:EReference" name="songs" eType="#//Song"
containment="true" eOpposite="#//Song/album"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="band" eType="#//Band" eOpposite="#//Band/albums"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Song" eSuperTypes="#//NamedElement">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="length" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="album" eType="#//Album"
eOpposite="#//Album/songs"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
</ecore:EPackage>[/XML]
Das einfach als musiclibrary.ecore speichern, dann new -> EMF Generator Model -> Ecore auswählen -> Code generieren lassen
 

Andreas29

Bekanntes Mitglied
Hi,

erstmal Danke für deine Antwort. Nur leider hilft sie mir nicht wirklich weiter. Mir geht es nicht um das Model, das habe ich fertig (übrigens ebenfalls in 5 Minuten... :) ). Mir geht es um das Binding des Modells an meine Eclipse E4 Oberfläche. Das wichtige ist hierbei das E4.
Ich habe die ecore-Datei erstellt (vielen Dank für deine Mühe) und daraus den Code generiert, sowohl Modell, Edit als auch Editor. Der Modell-Code ist leider sehr EMF-lastig oder daher nicht so schön und der Editorcode sieht mir sehr nach eclipse 3 aus (extends EditorPart z.B.), daher nützt mir das wenig.

Grüße und frohe Weihnachten,
Andreas
 

Wildcard

Top Contributor
Den Editor brauchst du nicht, sondern den Edit Code.
Dem TreeViewer setzt du noch den EMF Label und ContentProvider, und fertig:
Java:
viewer.setLabelProvider(new AdapterFactoryLabelProvider(yourItemProviderAdapterFactory));
viewer.setContentProvider(new AdapterFactoryContentProvider(yourItemProviderAdapterFactory));
Der Viewer reagiert nun automatisch auf Änderungen im Modell.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J SWT JFace Tree in Section unsichtbar (Eclipse Forms) AWT, Swing, JavaFX & SWT 5
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
G javafx build.fxbuild in eclipse und ANT AWT, Swing, JavaFX & SWT 9
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
C JavaFX mit CSS in Eclipse AWT, Swing, JavaFX & SWT 2
S Swing Schrift sehr klein Ubuntu/eclipse AWT, Swing, JavaFX & SWT 18
A Eclipse Windowbuilder Frameanzeige falsch AWT, Swing, JavaFX & SWT 3
C JavaFX Veränderungen in Scenebuilder in Eclipse als Quellcode anzeigen lassen AWT, Swing, JavaFX & SWT 11
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
VPChief Eclipse: Projekt mit src ordner exportieren. AWT, Swing, JavaFX & SWT 76
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
F Kein JavaFX mehr im Eclipse Wizard AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
B Swing Eclipse is running under 0, but this Java project has a 1.6 Java compliance level, so WindowBuilder AWT, Swing, JavaFX & SWT 2
F FXML Datei aus dem SceneBuilder in Eclipse aufrufen AWT, Swing, JavaFX & SWT 1
R JavaFX lässt sich nicht in Eclipse einbinden AWT, Swing, JavaFX & SWT 4
S download WindowBuilder Pro Eclipse AWT, Swing, JavaFX & SWT 1
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
I JAVAFX - CSS - automatische Property- und Methoden-Vorlagen in Eclipse AWT, Swing, JavaFX & SWT 17
I JAVA 8, JAVAFX und Eclipse – muss Eclipse extra eingerichtet werden? AWT, Swing, JavaFX & SWT 9
Z ProgressBar in Eclipse mit Wizard page? AWT, Swing, JavaFX & SWT 1
C Applet Applet funktioniert in Eclipse aber nicht in Browser AWT, Swing, JavaFX & SWT 1
J JavaFX Anwendung läuft in eclipse, nicht aber exportiert AWT, Swing, JavaFX & SWT 2
R Eclipse GUI Programmieren AWT, Swing, JavaFX & SWT 8
P Ubuntu - Eclipse - Windowbuilder AWT, Swing, JavaFX & SWT 0
M 3D-Grafik Mac Java 3D in Eclipse Exception AWT, Swing, JavaFX & SWT 0
O Eclipse Hitbox(en) AWT, Swing, JavaFX & SWT 6
D Robot Programm mit Escape abbrechen (aus Eclipse heraus) AWT, Swing, JavaFX & SWT 2
M LookAndFeel Oberfläche wie Eclipse/Business Objects oder Solvatio AWT, Swing, JavaFX & SWT 2
N Programm läuft perfekt in Eclipse aber nicht in .JAR AWT, Swing, JavaFX & SWT 3
T SWT benötige den richtigen SWT style --> org.eclipse.swt.SWT.* AWT, Swing, JavaFX & SWT 2
C Eclipse Filter-Muster AWT, Swing, JavaFX & SWT 2
H org.eclipse.swt.widgets.Scale MouseRelease listener AWT, Swing, JavaFX & SWT 1
H org.eclipse.swt.Slider ohne Buttons AWT, Swing, JavaFX & SWT 1
H org.eclipse.swt.widgets.Slider und negative Werte AWT, Swing, JavaFX & SWT 3
L Eclipse Fehler besser zu verstehen!!! AWT, Swing, JavaFX & SWT 4
B JAVAFX und CSS Datei in Eclipse AWT, Swing, JavaFX & SWT 4
M Swing in Eclipse AWT, Swing, JavaFX & SWT 1
A Eclipse Windowbuilder AWT, Swing, JavaFX & SWT 2
B JavaFX FXML - Eclipse einrichten AWT, Swing, JavaFX & SWT 2
G Eclipse: Design Tab wird nicht mehr angezeigt AWT, Swing, JavaFX & SWT 4
S Swing SplitButton wie in Eclipse AWT, Swing, JavaFX & SWT 5
P JApplet verhält sich im Browser anders als im Eclipse (AppletViewer) AWT, Swing, JavaFX & SWT 3
A Kinect und Eclipse AWT, Swing, JavaFX & SWT 2
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
J SWING - Programm ohne Eclipse etc. starten AWT, Swing, JavaFX & SWT 7
J SWT in eclipse importieren AWT, Swing, JavaFX & SWT 11
K Eclipse-Java Export/Import mit Oberfläche AWT, Swing, JavaFX & SWT 2
T eclipse.swt.widgets saveState NPE AWT, Swing, JavaFX & SWT 5
V Laden einer Bitmap / Eclipse-Problem? AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Punkt in Eclipse AWT, Swing, JavaFX & SWT 4
S JavaFX 2.0 in Eclipse RAP??? AWT, Swing, JavaFX & SWT 6
M Eclipse-Platform Combo-Binding für User-Einträge AWT, Swing, JavaFX & SWT 9
D VE in Eclipse mag einfach nicht funktionieren AWT, Swing, JavaFX & SWT 5
S FileFilter Problem Eclipse AWT, Swing, JavaFX & SWT 7
V Eclipse View Right-Click Menu hinzufügen AWT, Swing, JavaFX & SWT 2
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
T SWT Drag&Drop: Eclipse FileTransfer mit Icons AWT, Swing, JavaFX & SWT 14
M GEF und Eclipse Plugin schwierigkeiten AWT, Swing, JavaFX & SWT 2
B Debugging in Eclipse, Aufrufreihenfolge AWT, Swing, JavaFX & SWT 3
E Wo findet man: org.eclipse.core.runtime.ListenerList AWT, Swing, JavaFX & SWT 4
S [Eclipse RCP] Relativer Pfad AWT, Swing, JavaFX & SWT 8
Binary.Coder Netbeans GUI zu Eclipse (schon gegooglet und einiges ausprobiert). AWT, Swing, JavaFX & SWT 4
P SWT Eclipse Draw2D Drag and Drop (ruckelt) AWT, Swing, JavaFX & SWT 4
G Große dynamische ContextMenus erzeugen (Eclipse RCP) AWT, Swing, JavaFX & SWT 4
Crashbreaker SWT Frames wie bei Eclipse AWT, Swing, JavaFX & SWT 43
J Swing Pro WindowBuilder in Eclipse AWT, Swing, JavaFX & SWT 2
D Problem mit SmartGWT (2.4) und Eclipse (3.6) AWT, Swing, JavaFX & SWT 6
M 3D-Grafik Java3D-Application als executable .jar exportieren (Eclipse) AWT, Swing, JavaFX & SWT 5
K SWT oder AWT als Download für Eclipse AWT, Swing, JavaFX & SWT 5
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JavaHelp mit Eclipse AWT, Swing, JavaFX & SWT 2
B SWT Hello World-Anwendung mit GUI in Eclipse -Problem mit Import von SWT AWT, Swing, JavaFX & SWT 9
J eclipse/Visual Editor: Auf Felder/Methoden vom Hauptframe zugreifen AWT, Swing, JavaFX & SWT 4
M Swing Memory Spiel in Eclipse AWT, Swing, JavaFX & SWT 5
U Netbeans GUI nach Eclipse AWT, Swing, JavaFX & SWT 7
J Anwendung von Swing nach SWT bzw. Eclipse portieren AWT, Swing, JavaFX & SWT 3
G Look And Feel in Eclipse AWT, Swing, JavaFX & SWT 2
D Swing eine Art vorschlagsfenster wie in eclipse bei "." AWT, Swing, JavaFX & SWT 5
M SWT pack() von org.eclipse.swt.widgets.Control AWT, Swing, JavaFX & SWT 8
H Eclipse View / Window Layout AWT, Swing, JavaFX & SWT 3
S Dropdown-Menü wie auf der Eclipse-Toolbar AWT, Swing, JavaFX & SWT 7
T [Applet] startet in Eclipse aber nicht im Browser AWT, Swing, JavaFX & SWT 2
D Autovervollständigung wie bei Dreamweaver/Eclipse AWT, Swing, JavaFX & SWT 4
K Eclipse Visual Editor rendert die Komponenten nicht richtig AWT, Swing, JavaFX & SWT 2
K nervende eigenschaft von eclipse AWT, Swing, JavaFX & SWT 3
P Programm terminiert nicht (unter Eclipse) AWT, Swing, JavaFX & SWT 5
I Spezieller Knopf in Swing? Soll sein wie der Run in Eclipse. AWT, Swing, JavaFX & SWT 4
S Eclipse Icon Set AWT, Swing, JavaFX & SWT 6
T SWT/Eclipse Form Controls zur Laufzeit hinzufügen,GridLayout AWT, Swing, JavaFX & SWT 4
F Bilder im Quellcode verstecken - Eclipse AWT, Swing, JavaFX & SWT 15
W java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/Dev AWT, Swing, JavaFX & SWT 1
D Tooltips in Eclipse AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben