SWT Tabelle mit Werten befüllen

calmar

Mitglied
hi,

hier einmal mein code:

Java:
protected void createTable(Composite parent) {

		Section engagementSection = this.toolkit.createSection(parent,
				Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE
						| Section.EXPANDED);
/*		engagementSection.addExpansionListener(new ExpansionAdapter() {
			@Override
			public void expansionStateChanged(ExpansionEvent e) {
				KuenstlerEditor.this.form.reflow(true);
			}
		});*/
		engagementSection.setText("Veranstaltungen");
		engagementSection.setLayoutData(new GridData(GridData.FILL_BOTH));

		this.tableViewer = new TableViewer(engagementSection, SWT.BORDER
				| SWT.FULL_SELECTION);
		this.tableViewer.getTable().setLayoutData(
				new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
		TableLayout layout = new TableLayout();
		layout.addColumnData(new ColumnWeightData(28, 100, true));
		layout.addColumnData(new ColumnWeightData(28, 100, true));
		layout.addColumnData(new ColumnWeightData(28, 100, true));
		layout.addColumnData(new ColumnWeightData(28, 100, true));
		layout.addColumnData(new ColumnWeightData(28, 100, true));
		layout.addColumnData(new ColumnWeightData(28, 100, true));
		this.tableViewer.getTable().setLayout(layout);

		this.tableViewer.getTable().setLinesVisible(true);
		this.tableViewer.getTable().setHeaderVisible(true);

		this.tableViewer.setContentProvider(new ArrayContentProvider());
		IVeranstaltungService ivs = new VeranstaltungService();
		tableViewer.setInput(ivs.findAllVeranstaltung().toArray());
		
		
		this.tableViewer.setLabelProvider(new ITableLabelProvider() {

			@Override
			public Image getColumnImage(Object arg0, int arg1) {
				return null;
			}

			@Override
			public String getColumnText(Object element, int index) {
				Veranstaltung e = (Veranstaltung) element;
				switch (index) {
				case 0:
					if (e != null) {
						return e.getBezeichnung();
					} else {
						return "";
					}
				case 1:
					if (e != null) {
						return e.getKategorie();
					} else {
						return "";
					}
				case 2:
					if (e != null) {
						return e.getSpracheton();
					} else {
						return "";
					}
				case 3:
					if (e != null) {
						return e.getHinweis();
					} else {
						return "";
					}
				case 4:
					if (e != null) {
						return e.getFreigabe();
					} else {
						return "";
					}
				case 5:
					if (e.getDauer() == null) {
						return "";
					} else {
						return e.getDauer().toString();
					}
				}
				return null;
			}

			@Override
			public void addListener(ILabelProviderListener listener) {
				// nothing to do
			}

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

			@Override
			public boolean isLabelProperty(Object arg0, String arg1) {
				return true;
			}

			@Override
			public void removeListener(ILabelProviderListener arg0) {
				// nothing to do
			}
		});

		TableColumn colBezeichnung = new TableColumn(this.tableViewer
				.getTable(), SWT.LEFT);
		colBezeichnung.setText("Bezeichnung");
		TableColumn colKategorie = new TableColumn(this.tableViewer.getTable(),
				SWT.LEFT);
		colKategorie.setText("Kategorie");
		TableColumn colSpracheton = new TableColumn(this.tableViewer.getTable(),
				SWT.LEFT);
		colSpracheton.setText("Sprache");
		TableColumn colHinweis = new TableColumn(this.tableViewer.getTable(),
				SWT.LEFT);
		colHinweis.setText("Hinweis");
		TableColumn colFreigabe = new TableColumn(this.tableViewer.getTable(),
				SWT.LEFT);
		colFreigabe.setText("Freigabe");
		TableColumn colDauer = new TableColumn(this.tableViewer.getTable(),
				SWT.LEFT);
		colDauer.setText("Dauer");

		this.toolkit.adapt(this.tableViewer.getTable(), true, true);
		engagementSection.setClient(this.tableViewer.getTable());
	}
}

mein problem ist, dass nur in der ersten tabellenspalte die werte stehen, d.h. in der Spalte "Bezeichnung".

Die übrigen Spalten sind leer (d.h. kategorie, sprache, hinweis usw...). ich habe auch noch nie mit JFace gearbeitet - freue mich über jeden hinweis

🙂

danke im vorhinein!
 
Einer Tabelle darf man kein Layout setzen (auch nicht wenn das Ding TableLayout heißt 😉).
Die größe musst du direkt auf der Column setzen.
 
hi,

vielleicht bin ich zu doof den hinweis zu verstehen ???:L! (Das Beispiel ist etwas anders als in meinem ersten Post, aber das gleiche Problem):

Hier mein Beispiel:

Java:
/**
	 * Hier wird die Tabelle mit den Auffuehrungen zu dieser Veranstaltung erzeugt. 
	 * @param parent
	 */
	protected void createTableAuffuehrungen(Composite parent) {

		Section auffuehrungSection = this.toolkit.createSection(parent,
				Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE
						| Section.EXPANDED);
		auffuehrungSection.addExpansionListener(new ExpansionAdapter() {
			@Override
			public void expansionStateChanged(ExpansionEvent e) {
				VeranstaltungEditor.this.form.reflow(true);
			}
		});
		
		Composite left = this.toolkit.createComposite(auffuehrungSection);
		left.setLayout(new GridLayout(2, false));

		auffuehrungSection.setText("Auff�hrungen");
		auffuehrungSection.setLayoutData(new GridData(GridData.FILL_BOTH));

		this.tableViewerAuffuehrung = new TableViewer(left, SWT.BORDER
				| SWT.FULL_SELECTION);
	
		this.tableViewerAuffuehrung.getTable().setLayoutData(
				new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
/*		TableLayout layout = new TableLayout();
		layout.addColumnData(new ColumnWeightData(20, 100, true));
		layout.addColumnData(new ColumnWeightData(20, 100, true));
		layout.addColumnData(new ColumnWeightData(15, 100, true));
		layout.addColumnData(new ColumnWeightData(25, 100, true));
		layout.addColumnData(new ColumnWeightData(28, 100, true));
		
		this.tableViewerAuffuehrung.getTable().setLayout(layout)*/;
		this.tableViewerAuffuehrung.getTable().setLinesVisible(true);
		this.tableViewerAuffuehrung.getTable().setHeaderVisible(true);
		
		IAuffuehrungService avs = new AuffuehrungService(); 
		Auffuehrung auffuehrung = new Auffuehrung(); 
		auffuehrung.setVeranstaltung(veranstaltung);
		List<Auffuehrung> foundAuffuehrung = avs.findByAuffuehrung(auffuehrung);
		
		
		for (int i = 0; i < foundAuffuehrung.size(); i++){
			log.trace(foundAuffuehrung.get(i)); 
		}
		
		this.tableViewerAuffuehrung.setContentProvider(new ArrayContentProvider());
		tableViewerAuffuehrung.setInput(foundAuffuehrung.toArray());
		this.tableViewerAuffuehrung.setLabelProvider(new ITableLabelProvider() {

			@Override
			public Image getColumnImage(Object arg0, int arg1) {
				return null;
			}

			@Override
			public String getColumnText(Object element, int index) {
				
				Auffuehrung auffuehrung = (Auffuehrung) element;
				
				switch (index) {
				
				case 0:
					if (auffuehrung.getDatumuhrzeit() != null) {
						return auffuehrung.getDatumuhrzeit().toString();
					} else {
						return "";
					}
				case 1:
					if(auffuehrung.isStorniert())
					return "true";
					else
						return "false";
				case 2:
					Integer.toString(auffuehrung.getPreis());
				case 3:
					if (auffuehrung.getSaal() == null) {
						return "";
					} else {
						return auffuehrung.getSaal().getBezeichnung();
					}
				case 4:
					if (auffuehrung.getHinweis() == null) {
						return "";
					} else {
						return auffuehrung.getHinweis();
					}
				}
				return null;
			}

			@Override
			public void addListener(ILabelProviderListener listener) {
				// nothing to do
			}

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

			@Override
			public boolean isLabelProperty(Object arg0, String arg1) {
				return true;
			}

			@Override
			public void removeListener(ILabelProviderListener arg0) {
				// nothing to do
			}
		});

		TableColumn colDatumUhrzeit = new TableColumn(this.tableViewerAuffuehrung.getTable(),
				SWT.LEFT);
		colDatumUhrzeit.setWidth(250);
		colDatumUhrzeit.setText("Datum und Uhrzeit");
		TableColumn colStorniert = new TableColumn(this.tableViewerAuffuehrung.getTable(),
				SWT.LEFT);
		colStorniert.setWidth(150);
		colStorniert.setText("Storniert");
		TableColumn colPreis = new TableColumn(this.tableViewerAuffuehrung.getTable(),
				SWT.LEFT);
		colPreis.setWidth(150);
		colPreis.setText("Preis");
		TableColumn colSaal = new TableColumn(this.tableViewerAuffuehrung.getTable(),
				SWT.LEFT);
		colSaal.setWidth(150);
		colSaal.setText("Saal");
		TableColumn colHinweis = new TableColumn(this.tableViewerAuffuehrung.getTable(),
				SWT.LEFT);
		colHinweis.setWidth(250);
		colHinweis.setText("Hinweis");


		this.toolkit.adapt(this.tableViewerAuffuehrung.getTable(), true, true);
		auffuehrungSection.setClient(left);
		
	}

Jetzt habe ich die Breite direkt auf der Column gesetzt. Es wird jedoch in der Tabelle nur "Datum und Uhrzeit" angezeigt, alle anderen Spalten sind leer!

Will mir eigentlich ersparen extra einen ContenProvider zu schreiben, das muss doch auch einfach mit einem ArrayContentProvider() funktionierten - oder liege ich das falsch?

lg
 
Korrektur wegen des Layouts, ich war gedanklich bei einem anderen Layout, das war schon alles ok 😳

Ich würde mal vermuten das dein Problem hier liegt:
Java:
        this.tableViewerAuffuehrung.setContentProvider(new ArrayContentProvider());
        tableViewerAuffuehrung.setInput(foundAuffuehrung.toArray());
        this.tableViewerAuffuehrung.setLabelProvider(new ITableLabelProvider() {
Der LabelProvider muss gesetzt werden bevor du den Input setzt. Mich wundert allerdings das du nicht sofort eine Exception bekommst, denn eigentlich sollten StructuredViewer eine Exception werfen wenn kein Label/ContentProvider gesetzt ist.
 
hi,

das war es auch nicht.

kann es sein, dass der ArrayContentProvider nur funktioniert wenn man ein Set übergibt?

hab bei einem kollegen, der etwas ähnliches zu programmieren hatte, das angesehen. der übergibt ein set und es funktioniert eigentlich einwandfrei...

ich hab mir jetzt für mein problem doch einen eigenen ContentProvider geschrieben, und es so gelöst... aber ich wollte halt gerne code sparen 🙂

mfg und nochmals vielen dank für die antworten
 

Zurück
Oben