SWT TableCell mit Composite als Inhalt / Höhe der Cell/Row

Sno0t

Mitglied
Hallo liebe Gemeinde,

Ich möchte in einer Table (über ein TableViewer erstellt) ein eigenes Composite einfügen und darstellen.
(Ein GridLayout mit einem Textlabel + Icon in auf der linken Seite der Cell, auf der rechten Seite in der oberen Zeile ein Label mit Text und in der unteren ebenso)

Soweit klappt es auch über ein TableEditor die Cell mit den Daten zu befüllen.
Nur stehe ich nun vor 2 Problemen:

Zum einen wird die Cell(bzw ja gesamte Row) nicht dynamisch an die benötigte Höhe angepasst, so geht ein Teil der Composite verloren.

Zum Anderen, ist der Bereich nun auch nicht mehr "im Gesamten", sprich als Selection innerhalb der Table anwählbar.

Daher die Fragen:
- Wie kann ich dafür sorgen das die Cell in ihren Dimensionen so angepasst wird, das der gesamte Content einer Cell sichtbar ist (oder man zumindest scrollen kann)

- Wie kann ich dafür sorgen, das eine Selection auf dem Composite an die Table weiter geleitet wird als würde ich die Row ganz normal auswählen?

Vielen Dank im Voraus.


Anhängend meine Code-Schnipsel:

erstellen der Table:
Java:
TableColumnLayout	layout	= new TableColumnLayout();

this.setLayout(layout);// "this" ist ein einfaches Composite auf dem die Table angezeigt wird.
TableViewer viewer = new TableViewer(this, SWT.MULTI);
// ContentCol ist die Column dessen Cells mit dem "speziellen" Composite ausgerüstet werden soll
	contentCol = new TableViewerColumn(tableViewer, SWT.NONE); 
	layout.setColumnData(contentCol.getColumn(), new ColumnWeightData(100, 50, true));
	tableViewer.setContentProvider(new ArrayContentProvider());

	Table table = tableViewer.getTable();
	table.setHeaderVisible(false);
	table.setLinesVisible(true);


Und die Update Methode des CellLabelProviders:
Java:
public void update(ViewerCell cell) {
				TableItem item = (TableItem) cell.getItem();
				
				Composite cellPane = new Composite(tableViewer.getTable(), SWT.NONE);
				cellPane.setLayout(new FillLayout());

				MyContent list = (MyContent) item.getData();
				Composite paneForContent = new Composite(cellPane, SWT.NONE);
				paneForContent.setLayout(new GridLayout(2, false));

				Label lblIconText = new Label(paneForContent, SWT.NONE);
				lblIconText.setText(list.getMyContentName());
				lblIconText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 2));
				// bisher wird noch kein icon hinzugefügt
				
				Label lblText1 = new Label(paneForContent, SWT.NONE);
				lblText1.setText(list.getParkName());
				lblText1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true, 1, 1));
				
				Label lblText2 = new Label(paneForContent, SWT.NONE);
				lblText2.setText(list.getPowerUnitName());
				lblText2.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true, 1, 1));

				TableEditor editor = new TableEditor(tableViewer.getTable());
				editor.grabHorizontal = true;
				editor.grabVertical = true;
				editor.setEditor(cellPane, item, cell.getColumnIndex());
				editor.layout();
			}
});


Beste Grüße
 
Hi,

ich hab schon eine Weile nichts mehr mit SWT gemacht, aber ich glaube mich zu erinnern, dass Composites in Tabellen eher kompliziert sein sollten.
Schau mal beim Nebula-Projekt. Wenn ich mich recht entsinne, gab es da etwas, wie CompositeTables... Vielleicht hilft dir dass ja weiter: Nebula Project

Grüsse,
Daniel

PS: Das ist jetzt in keinster Weise hilfreich, aber: In JavaFX kann man recht einfach eigenen Content in Tabellenzellen einbinden.

PPS: Hab ich schon mal erwähnt, dass man mit FXCanvas JavaFX ohne Probleme in SWT-Anwendungen einbetten kann? Nachteil ist nur das andere Look-&-Feel

PPPS: Noch eine letzte Bemerkung: SWT und JavaFX teilen sich sogar den selben UI-Thread, d.h. nicht einmal nerviges Zeug á la [c]Platform.runLater(Runnable)[/c] ist nötig!

PPPPS: Das ist alles nur Info am Rande, was du damit anstellst, ist deine Sache...
 
Hi,

Ich danke dir für deine Antwort 🙂
Ich werde mich mal ein wenig in den von dir geposteten Links einlesen, vielleicht findet sich ja etwas das ich auf meine Anwendung abstrahieren kann.
Bin natürlich für weitere Vorschläge offen, sollte ich was finden bzw. eine Lösung gebastelt bekommen, werde ich das ganze hier posten ^^
 
Danke, das ist nett, falls mal wer anders in eine ähnliche Lage kommt. Weitere SWT-spezifische Vorschläge kann ich dir leider nicht liefern.
 
Hallo,

Ich komme in nächster Zeit leider nicht dazu an meinem Projekt weiter zu basteln.
Allerdings habe ich Lösungsansätze gefunden die funktionieren sollten:

Es gibt für die oben genannte Problematik 2 Ansätze.
Nummer 1: einen neuen Listener erstellen, der nach dem Listener-event fragt, und dieses dann entsprechend behandelt.
Als erses den Listener erstellen
Java:
Listener myListener = new Listener() {
      public void handleEvent(Event event) {
        switch (event.type) {
        case SWT.MeasureItem: {
          event.width = 200;
          event.height = 200;
          break;
        }
        }
      }
    };

und anschließend der Table als Listener hinzufügen:

Java:
// Event bei welchem der Listener greift, und der Listener selbst
table.addListener(SWT.MeasureItem, myListener);

Dies sollte funktionieren, konnte es aber leider nicht testen.
Die 2. Möglichkeit (Denke die elegantere) ist es einen der folgenden LabelProvider für die Columns zu nutzen:
OwnerDrawLabelProvider, StyledCellLabelProvider
und dort die Methode "measure()" und ggf. "paint()" überschreiben.
Java:
myColumn.setLabelProvider(new OwnerDrawLabelProvider() {
      @Override
      protected void measure(Event event, Object element) {
        event.setBounds(new Rectangle(event.x, 
            event.y, 
            myBounds.width, 
           myBounds.height));
      }
    });

Wie gesagt, das ist alles noch ungetestet und basiert erstmal nur auf Theorie.
Habe die Sachen allerdings auf verlässlichen Seiten gefunden (Links kommen gleich)
Wenn jemand die Möglichkeit findet es Zeitnah zu testen und Meinungen Preiszugeben, wäre das sehr hilfreich.
Ansonsten werde ich das übernehmen wenn ich an meinem Projekt weiter arbeiten kann.

Für beide Varianten hier die weiterführenden Links:

MultilineCell Java2s

Advanced JFaceTable Vogella
 
Danke für die Tipps! Klingt erst mal interessant. Sollte ich noch einmal zu einem SWT-Projekt kommen, versuche ich es mir bis dahin zu merken ;-)
 

Zurück
Oben