RCP TableViewer schrumpft in View nach manueller Resize auf 1 Zeile

mandypb86

Mitglied
Hallo zusammen,

ich habe jetzt schon ca. 3 Stunden dran rumgebastelt und krieg langsam die Krise. Hab die Problemview sogar nochmal mit dem WindowBuilder nachgebaut, aber immer noch das gleiche Problem:

Beschreibung der Situation:
Meine Problemview UView ist fast identisch mit einer weiteren View LView. Beide wurden mit dem FormToolkit erstellt und beide enthalten einen identischen
Code:
TableViewer
(gleiche Spalten, gleicher
Code:
LabelProvider
, aber unterschiedlicher
Code:
ContentProvider
, dazu gleich mehr).
Die Problemview UView enthält zusätzlich ein
Code:
Textfeld
und einen
Code:
Button
über dem
Code:
TableViewer
zum Auswählen und Anzeigen eines Verzeichnisses, sowie zwei weitere
Code:
Buttons
darunter zum Hinzufügen und Entfernen von weiteren Elementen (noch nicht implementiert).

In beiden
Code:
TableViewern
werden Objekte vom Typ L angezeigt. Bei dem anständig funktionierenden steckt das übergeordnete EMF-Objekt O drin und wird deshalb mit dem
Code:
AdapterFactoryContentProvider
befüllt.
In der rumzickenden UView steckt als Input eine
Code:
List<L>
drin und wird deshalb mit dem
Code:
ArrayContentProvider[code] befüllt.

[B]Beschreibung des Fehlers[/B]
Beide [code]TableViewer
werden über entsprechende Methoden anständig mit Werten befüllt.
Beim Füllen der problematischen UView (also vermutlich beim
Code:
setInput()
) wird die Tabelle zwar ordentlich aufgezogen, sodass alle Elemente sichtbar sind, es verschwinden aber die zwei
Code:
Buttons
UNTER dem
Code:
TableViewer
. Die sind einfach weg, ich seh auch keinen Scrollbalken.

Zweiter Punkt:
Verändere ich die Größe der UView manuell durch Ziehen der Kanten der View oder auch des gesamten Programmfensters, schrumpft mein
Code:
TableViewer
auf eine Zeile zusammen und lässt sich auch nicht dazu hinreißen wieder größer zu werden.
Dafür sind die beiden
Code:
Buttons
unter dem Viewer aber wieder da.

Die fast identische LView macht diese Zicken nicht. Der
Code:
TableViewer
dort behält beim Resize der umgebenden View seine feste Größe.

Frage
Hat jemand auch nur den Hauch einer Ahnung, wo eventuell das Problem liegt? Ich krieg hier bald Zustände, weil das Ding wirklich jedes Mal, wenn ich die View resize zusammenschrumpft.

Schonmal danke im Voraus sagt
M@ndy
 

mandypb86

Mitglied
Hmm,

also ich konnte das Problem eingrenzen.
Das Phänomen tritt
a) nur dann auf, wenn der TableViewer erst leer ist (also noch kein setInput() zur Erstellungszeit gemacht wird, sondern erst in einer Userinteraktion z.B. aus einem Listener raus) UND
b) nur beim TableWrapLayout auf.

Die funktionierende View benutzt zwar auch das FormToolkit, aber in dem Form ein RowLayout.
Dort macht es auch keinen Unterschied, ob der TableViewer leer war. Ich befülle den auch später erst und er behält seine Größe trotzdem.

Hab jetzt mal dem TableViewer im TableWrapData eine heightHint mitgegeben. Jetzt ist er brav, aber immer halt mindestens so groß, wie angegeben, was bei wenigen Elementen natürlich zu groß ist.
Es muss doch möglich sein, die Höhe des Viewers der Anzahl der Elemente anzupassen oder nicht?

Zum angucken aber auch mal ein KSKB:
Java:
package kskb_uview;

import java.util.ArrayList;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
import org.eclipse.ui.part.ViewPart;


public class UView extends ViewPart {
	
	public static final String ID = "KSKB_UView.view1";

	private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
	private Text t_pfad;
	private Table table;
	private TableViewer tableViewer;
	
	private ArrayList<L> lieder = new ArrayList<L>();
	
	public UView() {
		
	}

	/**
	 * Create contents of the view part.
	 * @param parent
	 */
	@Override
	public void createPartControl(Composite parent) {
		{
			ScrolledForm form = formToolkit.createScrolledForm(parent);
			formToolkit.paintBordersFor(form);
			form.setText("USB Stick");
			{
				TableWrapLayout tableWrapLayout = new TableWrapLayout();
				tableWrapLayout.numColumns = 3;
				form.getBody().setLayout(tableWrapLayout);
			}
			{
				t_pfad = formToolkit.createText(form.getBody(), "", SWT.READ_ONLY);
				t_pfad.setLayoutData(new TableWrapData(TableWrapData.FILL, TableWrapData.TOP, 1, 2));
			}
			{
				Button btn_waehle = formToolkit.createButton(form.getBody(), "W\u00E4hle...", SWT.NONE);
				btn_waehle.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						// wähle Pfad und füge kompatible Children in tableviewer ein
						tableViewer.setInput(L.l_list);
					}
				});
			}
			{
				Label lbl_hinweis = formToolkit.createLabel(form.getBody(), "Hinweis: bla bla", SWT.WRAP);
				lbl_hinweis.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP, 1, 2));
			}
			// leeres Label um letzte Spalte zu füllen
			new Label(form.getBody(), SWT.NONE);
			{
				tableViewer = new TableViewer(form.getBody(), SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
				table = tableViewer.getTable();
				TableLayout tableLayout = new TableLayout();
				table.setLayout(tableLayout);
				table.setHeaderVisible(true);
				TableWrapData twd_table = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.FILL_GRAB, 1, 2);
				twd_table.grabHorizontal = true;
				twd_table.heightHint = 200; // mit heightHint bleibt er groß, ohne nicht
				table.setLayoutData(twd_table);
				formToolkit.paintBordersFor(table);
				{
					TableColumn tblclmnColumn1 = new TableColumn(table, SWT.NONE);
					tableLayout.addColumnData(new ColumnWeightData(2, 80, true));
					tblclmnColumn1.setText("Column1");
				}
				{
					TableColumn tblclmnColumn2 = new TableColumn(table, SWT.NONE);
					tableLayout.addColumnData(new ColumnWeightData(2, 80, true));
					tblclmnColumn2.setText("Column2");
				}
				{
					TableColumn tblclmnColumn3 = new TableColumn(table, SWT.NONE);
					tableLayout.addColumnData(new ColumnWeightData(2, 80, true));
					tblclmnColumn3.setText("Column3");
				}
				{
					TableColumn tblclmnColumn4 = new TableColumn(table, SWT.NONE);
					tableLayout.addColumnData(new ColumnWeightData(2, 80, true));
					tblclmnColumn4.setText("Column4");
				}
				{
					TableColumn tblclmnColumn5 = new TableColumn(table, SWT.NONE);
					tableLayout.addColumnData(new ColumnWeightData(2, 80, true));
					tblclmnColumn5.setText("Column5");
				}
				tableViewer.setLabelProvider(new LLabelProvider());
				tableViewer.setContentProvider(new ArrayContentProvider());
			}
			new Label(form.getBody(), SWT.NONE);
			{
				Button btn_hinzufuegen = formToolkit.createButton(form.getBody(), "Hinzuf\u00FCgen", SWT.NONE);
				btn_hinzufuegen.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						// TODO öffne Liste von importierten Liedern
					}
				});
			}
			{
				Button btn_entfernen = formToolkit.createButton(form.getBody(), "Entfernen", SWT.NONE);
				btn_entfernen.addSelectionListener(new SelectionAdapter() {
					@Override
					public void widgetSelected(SelectionEvent e) {
						// TODO entferne Selection physikalisch vom Stick
					}
				});
			}
			// leeres Label um die letzte Spalte aufzufüllen
			new Label(form.getBody(), SWT.NONE);
		}

		createActions();
		initializeToolBar();
		initializeMenu();
	}

	/**
	 * 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() {
		t_pfad.setFocus();
	}
	
	
	
	public void refresh(){
		tableViewer.getControl().pack();
	}
	
	class LLabelProvider implements ITableLabelProvider{

		@Override
		public void addListener(ILabelProviderListener listener) {
		}

		@Override
		public void dispose() {
		}

		@Override
		public boolean isLabelProperty(Object element, String property) {
			return false;
		}

		@Override
		public void removeListener(ILabelProviderListener listener) {
		}

		@Override
		public Image getColumnImage(Object element, int columnIndex) {
			return null;
		}

		@Override
		public String getColumnText(Object element, int columnIndex) {
			L l = new L();;
			if(element instanceof L)
				l = (L) element;
			switch(columnIndex){
			case 0:
				return l.getValue1();
			case 1:
				return l.getValue2();
			case 2:
				return l.getValue3();
			case 3:
				return l.getValue4();
			case 4:
				return l.getValue5();
			}
			return null;
		}
		
	}

}

// Kleine Dummy Model-Klasse

package kskb_uview;

import java.util.ArrayList;

public class L {
	private String value1, value2, value3, value4, value5;
	public static ArrayList<L> l_list = new ArrayList<L>(); 

	public L() {
		value1="value1";
		value2="value2";
		value3="value3";
		value4="value4";
		value5="value5";
	}

	/**
	 * @return the value1
	 */
	public String getValue1() {
		return value1;
	}

	/**
	 * @return the value2
	 */
	public String getValue2() {
		return value2;
	}

	/**
	 * @return the value3
	 */
	public String getValue3() {
		return value3;
	}

	/**
	 * @return the value4
	 */
	public String getValue4() {
		return value4;
	}

	/**
	 * @return the value5
	 */
	public String getValue5() {
		return value5;
	}
	
	public static void init(){
		for(int i=0;i<5;i++){
			l_list.add(new L());
		}
	}
	
	
}

Wie gesagt, mit dem heightHint geht es jetzt ERSTMAL, aber zufriedenstellend ist das noch nicht.

Lieben Gruß
M@ndy
 
G

Gast2

Gast
Ich würde für den Tablviewer ein anderes Layout für die Columns nehmen schau mal hier bei prozentual

Eclipse RCP: JFace TableViewer

Außerdem würde ich ein GridLayout für das body.getForm verwenden dann kannst alles richtig anorden und vor allem auch wachsen lassen
 

mandypb86

Mitglied
Die Spalten sind ja nicht das Problem, die bleiben alle ordentlich. Und prozentuale Verteilung ist mir jetzt nicht unbedingt sooo wichtig. Das funktioniert ja mit dem ColumnWeightData auch prinzipiell über das weigth-Attribut

Ich hatte das TableWrapLayout benutzt, da mir das Label über dem Viewer beim Originaltext zu lang war und umgebrochen werden sollte. Wenn ich die Tabelle aber wirklich komplett aufziehe, ist sie doch breiter als das Label.
Und das TableWrapLayout ist dem GridLayout ja ähnlich. Man gibt dort ja auch eine Anzahl Spalten an (siehe Zeile 58).

Hab noch ne zweite Version mit nem vertikalen Rowlayout und Groups gemacht. Musste aber auch da mit height in der RowData für den TableViewer arbeiten soweit ich mich erinnere (bin grad am anderen Rechner).

Werd vllt einfach nochmal mit verschiedenen Layouts rumexperimentieren morgen (unabhängig von meinem Programm und schauen, was dabei rauskommt).

Erstmal schönes Wochenende wünscht
M@ndy
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G RCP EMF und RCP TableViewer Plattformprogrammierung 7
M RCP TableViewer auto-update? Plattformprogrammierung 3
G RCP TableViewer mit EMF Plattformprogrammierung 6
J TableViewer aus Editor refreshen Plattformprogrammierung 5
C TableViewer im Dialog / SelectionListener??? Plattformprogrammierung 3
G TableViewer, LabelProvider,TableViewerColumn Plattformprogrammierung 3
S Menüeintrag nur bei einen bestimmten TableViewer Plattformprogrammierung 3
S RCP Nach erfolgreicher Erstellung der View, wie weitermachen? Plattformprogrammierung 1
G RCP Show View Command bestimmte View nicht erlauben Plattformprogrammierung 2
S RCP ActionBar Icon nur aktiv, wenn Selection in bestimmter View Plattformprogrammierung 6
M Plugin - Property Page - Get IResource in View Plattformprogrammierung 4
R Eclipse RCP Tabellen-View (Anfängerfrage) Plattformprogrammierung 3
L RCP Eigene View für EditorPart? Plattformprogrammierung 3
M EMF und Tabbed Properties View Plattformprogrammierung 4
Madlip RCP View austauschen/ändern Plattformprogrammierung 9
B RCP View aktualisieren bei Änderung 2. View Plattformprogrammierung 8
F RCP EMF View Plattformprogrammierung 13
K RCP View wird nicht angezeigt Plattformprogrammierung 2
L RCP Detached View beim Starten des RCPs? Plattformprogrammierung 3
F Tollbar Items disabled wenn View den Focus verliert Plattformprogrammierung 3
S RCP name einer view ändern Plattformprogrammierung 2
L RCP Help in eine View einbinden? Plattformprogrammierung 3
G RCP Menüpunkt Show View Plattformprogrammierung 7
G EMF -> Leere Elemente sollen in Property View nicht angezeigt werden Plattformprogrammierung 9
E eclipse RCP Properties View: ein Element aus Liste pro Zeile anzeigen Plattformprogrammierung 1
Z Eclipse RCP - UDP Strom in View anzeigen Plattformprogrammierung 4
L RCP Canvas in einer View? Plattformprogrammierung 4
lumo Eclipse + 'Could not create view' Plattformprogrammierung 5
L RCP View in einem Editor öffnen? Plattformprogrammierung 3
D Canvas auf View in Eclipse PlugIn Plattformprogrammierung 3
T RCP Menubar wird durch OLE-VIEW überschrieben Plattformprogrammierung 4
S Plugin: View beim Button-Klick austauschen Plattformprogrammierung 7
Saxony View als Image Plattformprogrammierung 2
S View Refreshen Plattformprogrammierung 2
T geladene Views / Event wenn View closed Plattformprogrammierung 4
S Steuerung View (Schließen erkennen/Hide anstatt Close) Plattformprogrammierung 2
S View speichern/laden beim schließen Plattformprogrammierung 14
L View schließen Plattformprogrammierung 7
L View nicht bekannt machen Plattformprogrammierung 4
lumo View aktivieren jedesmal wen.... Plattformprogrammierung 7
A Overlay in View eines anderen Plug-Ins zeichnen Plattformprogrammierung 2
A View ansprechen Plattformprogrammierung 5
T GMF Property View Plattformprogrammierung 4
M Command in Toolbar aktiv wenn View nicht aktiv Plattformprogrammierung 2
C RCP: Veraenderungen innerhalb einer View per Extension?! Plattformprogrammierung 7
T JSVGCanvas in RCP View anzeigen Plattformprogrammierung 5
ARadauer Mehrere Gui Elemente in View Plattformprogrammierung 4
B RCP - Zugriff von View auf andere View Plattformprogrammierung 4
Saxony [Eclipse RCP] Von woanders View updaten Plattformprogrammierung 11
S View aus anderen Thread aktualisieren Plattformprogrammierung 15
K Position einer Multiple View speichern Plattformprogrammierung 6
S RCP Anfängerfrage - Zusammenspiel View, Editor, Model Plattformprogrammierung 4
G View Daten übergabe. Plattformprogrammierung 4
N Nicht schließbare View? Plattformprogrammierung 7
C View updaten Teil 2 Plattformprogrammierung 2
B Eclipse RCP: View updaten Plattformprogrammierung 10
dzim Editor aus View öffnen - fehler: unbekannte Editor ID Plattformprogrammierung 11
J Editorfenster von View navigieren lassen? Plattformprogrammierung 5
T Aus einem View in das andere wecheln. Plattformprogrammierung 13
R SWT: nur eine Instanz einer View erlauben Plattformprogrammierung 5

Ähnliche Java Themen


Oben