SWT Problem mit Tabelle und Combobox in einem Wizard

Faltem

Mitglied
Hallo zusammen,

ich habe ein Problem beim Umgang mit Tabellen und Combobox innerhalb eines Wizard. Also ich habe eine zweispaltige Tabelle die angezeigt wird. In der ersten Spalte stehen Anforderungen, in der zweiten Spalte ist eine Combobox mit Auswahlmöglichkeiten zwischen 0 und 10. Jetzt möchte ich, dass der Anwender die Anforderungen bewertet und wenn er fertig ist, dann soll er auf einen Button klicken und die Tabelle soll in einer HashMap<String,Integer> gespeichert werden. Ich bekomme alles soweit hin doch wenn ich auf den Button klicke, dann schaffe ich es nicht die Tabelle einzulesen. Kann mir bitte jemand weiterhelfen? Ist mittlerweile recht dringend das anliegen und ich verzweifele echt, da ich bis jetzt noch nichts gefunden habe, was mir weiterhilft.
Über eine Antwort würde ich mich sehr freuen,

Besten Gruß,

Malte
 
Achso stimmt. Hier der Code.

Java:
package hoq.pages;

import hoq.wizard.HoQWizard;

public class HoQPageThreeGew extend	s WizardPage {

	private Composite container;
	private Button btnAnfLad;
	private Button btnAnfGewSpei;
	private Table tblGewTab;
	private HashMap<String, Integer> hasKundGew = new HashMap<String, Integer>();
	private TableEditor tblEditor;
	private Text txtKundenanforderung;
	private Combo cmbEval;
	private TableColumn tableColumn;
	private TableItem[] items;
	private ArrayList<String> arrstAnf;

	public HoQPageThreeGew() {
		super("wizardPage");
		setTitle("Wizard Page title");
		setDescription("Wizard Page description");
	}

	/**
	 * Create contents of the wizard.
	 * 
	 * @param parent
	 */
	public void createControl(Composite parent) {
		container = new Composite(parent, SWT.NULL);
		setControl(container);
		container.setLayout(null);

		btnAnfLad = new Button(container, SWT.NONE);
		btnAnfLad.setBounds(45, 10, 200, 28);
		btnAnfLad.setText("Anforderungen Laden");

		tblGewTab = new Table(container, SWT.BORDER | SWT.V_SCROLL
				| SWT.H_SCROLL);
		tblGewTab.setHeaderVisible(true);
		tblGewTab.setLinesVisible(true);
		tblGewTab.setBounds(45, 45, 700, 300);

		btnAnfGewSpei = new Button(container, SWT.NONE);
		btnAnfGewSpei.setBounds(260, 10, 200, 28);
		btnAnfGewSpei.setText("Gewichtung Speichern");
		btnAnfGewSpei.setEnabled(false);

		fillTable();
		safeAnfEval();
		setPageComplete(false);

	}

	private void fillTable() {
		btnAnfLad.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent event) {
				btnAnfLad.setEnabled(false);
				btnAnfGewSpei.setEnabled(true);
				// Liste mit allen Kundenanforderungen
				arrstAnf = new ArrayList<String>();
				arrstAnf = HoQWizard.hoqDatenstruktur.getKundenanforderungen();

				// Zweispaltige Tabelle anlegen
				tableColumn = new TableColumn(tblGewTab, SWT.NONE);
				tableColumn.setWidth(500);
				tableColumn.setText("Kundenanforderung");
				tableColumn = new TableColumn(tblGewTab, SWT.NONE);
				tableColumn.setWidth(100);
				tableColumn.setText("Gewicht");

				// Anzahl der Zeilen erstellen
				for (int i = 0; i < arrstAnf.size(); i++) {
					new TableItem(tblGewTab, SWT.NONE);
				}

				// Zeilen füllen
				items = tblGewTab.getItems();
				for (int lineCounter = 0; lineCounter < items.length; lineCounter++) {
					tblEditor = new TableEditor(tblGewTab);
					txtKundenanforderung = new Text(tblGewTab, SWT.NONE);
					txtKundenanforderung.setText(arrstAnf.get(lineCounter));
					tblEditor.grabHorizontal = true;
					tblEditor.setEditor(txtKundenanforderung,
							items[lineCounter], 0);
					tblEditor = new TableEditor(tblGewTab);
					cmbEval = new Combo(tblGewTab, SWT.NONE);
					cmbEval.setText("");
					for (int evaluation = 0; evaluation <= 10; evaluation++) {
						cmbEval.add("" + evaluation);
					}
					tblEditor.grabHorizontal = true;
					tblEditor.setEditor(cmbEval, items[lineCounter], 1);
				}
			}
		});
	}

	/*
	 * ToDo: Liste in einer HashMap abspeichern. In dieser werden die
	 * Kundenanforderungen mit der Gewichtung gespeichert.
	 */
	private void safeAnfEval() {
		btnAnfGewSpei.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent event) {

				/*
				 * Zu Testzwecken, da ich dieses Problem noch nicht lösen kann
				 * wird eine fiktive Liste erstellt.
				 */

				for (int i = 0; i < arrstAnf.size(); i++) {
					if (i == 0) {
						hasKundGew.put(arrstAnf.get(i), 4);
					} else if (i % 3 == 0) {
						hasKundGew.put(arrstAnf.get(i), 2);
					} else if (i % 2 == 0) {
						hasKundGew.put(arrstAnf.get(i), 8);
					} else {
						hasKundGew.put(arrstAnf.get(i), 6);
					}
				}
				HoQWizard.hoqDatenstruktur.setGewAnf(hasKundGew);
				setPageComplete(true);
			}
		});
	}
}
 
Ist schon eine Weile her bei mir, aber gibt es nicht eine Methode die aufgerufen wird, wenn man "Weiter" drückt, im Wizard? Die müsstest du doch nur überschreiben? Oder überschreibe die #setPageComplete()-Methode und lese da deine Daten in die HashMap, bevor du es dann wirklich auf true setzt.
Und noch eine andere Frage: Warum verwendest du keine TableViewer? Initial vielleicht etwas mehr arbeit, aber einfacher an bestehende Modell zu binden... (siehe hier)
 
Moin,

besten Dank erstmal für deine Hilfe. Kenne mich mit dem Thema nicht wirklich aus und bin im Moment mehr oder weniger am einarbeiten und es muss schnell eine Lösung her. Das Problem ist ja nicht wann die Tabelle ausgelesen werden soll, sondern wie das geht. Also wenn auf den Button speichern geklickt wird, dann soll er die Datei einfach einlesen in die HashMap. Zur Vereinfachung könnte auch einfach erstmal die Tabelle Zeilenweise auf der Konsole ausgegeben werden mit
Java:
system.out.println()
aber wie geht das?
Was ist denn ein TableViewer? Wofür ist der zuständig?

Besten Gruß,

Malte
 
Hast du dir den Link überhaupt angeschaut??? Was wird ein Tableviewer wohl machen? Eine Tabelle anzeigen.

Kurz gesagt ist das JFace-Framework (das quasi schon Teil von SWT ist, oder nicht schwer anzubinden - noch dazu einmal: LIES DEN LINK!) ein Abstrahierung von der unsäglichen SWT-Table (schwer zu bedienen).

Der Ablauf ist dabei ungefähr so:
- Erstelle ein Daten-Modell (zum Beispiel die HashMap mit den Eingangsdaten - vielleicht wäre in Verzicht auf ein zweites Model (Liste) sinnvoll).
- Erstelle einen ContentProvider (gibt es separat für JFace List-, Table und TreeViewer, wobei die ersten beiden die selben verwenden können). Der ContentProvider liest die einzelnen Zeilen (Elemente aus deinem Model) aus.
- Erstelle einen LabelProvider (auch hier gibt es jeweils unterschiedliche für JFace List-, Table und TreeViewer - abhängig vom Einsatzzweck aber mit Überschneidungen).
- Du brauchst dann wahscheinlich noch einen CellEditor (ich glaube so hiess das - bin aber wie gesagt schon eine Weile raus), damit du die ComboBox-Sache hast
- Anstelle der Table verwendest du nun den TableViewer (siehe LINK aus dem letzten Beitrag)

Somit ist es möglich, das der TableViewer dein (weiter zu verwendendes) Datenmodell schon während der Nutzung auf dem laufenden hält - ein separates Übersetzen kann dann entfallen.

Aber wie gesagt: Lies dir das Tutorial durch, dass ich dir gegeben habe. Es isz zwar Anfangs deutlich aufwendiger, erspart dir auf lange Sicht aber viel Ärger - auch bei Anpassungen zum Beispiel.
 

Zurück
Oben