SWT-Combobox Einträge aus 3 Spalten einer Tabelle zusammenstellen

haudek

Grünschnabel
Hallo,

ich habe folgendes Problem, und komme nicht weiter. Auch auch hier im Forum habe ich leider noch keine Lösung gefunden:

Ich habe eine Kundentabelle aus einer Datenbank. ca. 5000 -10000 Kunden.
In meiner Applikation möchte ich nun eine Combobox (Kundenauswahl) erstellen, die sich aus der 3 Spalten (Kurzname, Name, Ort) dieser Kundentabelle zusammensetzt. Sprich die Combo soll den Inhalt aller 3 Spalten anzeigen.
Im Anhang habe ich ein kleines Bild/ Bsp. aus VisualBasic.

Kann mir jemand weiterhelfen, wäre super!!

gruß
 

Anhänge

  • combobox.jpg
    combobox.jpg
    38,3 KB · Aufrufe: 193
Und wo ist dein Problem jetzt genau? Trag in geeigneter Konkatenation die 3 Spalten als einen String in die Combobox ein und hinterlege z.B. in der Data der Combobox die Originalinformationen zu jedem Eintrag damit du nicht den String parsen musst.
 
Da ich in Java noch recht unerfahren bin,
habe ich wohl bereits das Problem bei dem, die Spalten in ein String zu packen.

Kann in eine Combobox nicht auch ein Objekt, bestehend aus einer Arraylist bzw. Array x Array (3 Spalten mal einige tausende Zeilen) übergeben werden.
Liege ich mit meinem Dankansatz konzeptionell falsch?

Wie ist denn eure Erfahrung mit der Performance. Die Combo soll nur zum Start der Applikation geladen werden.

Danke fürs Feedback!

gruß
Chris
 
Hallo

heisst das ich muss meine SWT GUI in SWING ändern.
mmmhhh, das kann doch nicht sein, oder?!

Wie ist dann der der folgende beitrag zu verstehen?
beitag

Ich habe es bisher noch nicht geschafft, mein Inhalt aus der 3 Spalten einer Tabelle in eine Combobox zu bringen.

Wäre jemand bereit, mir eventuell einen Ansatz zu posten?
:(

@zeja:
Was meinst mit:
Trag in geeigneter Konkatenation die 3 Spalten als einen String in die Combobox ein und hinterlege z.B. in der Data der Combobox die Originalinformationen zu jedem Eintrag damit du nicht den String parsen musst.

bisher habe ich dies verzweifelt versucht. Hast Du mir einen Anhaltspunkt...
 
Du läufst in einer for-Schleife über deine Tabellenzeilen
Liest die erste Spalte einer Zeile aus = String column1
zweite Spalte = String column2
dritte Spalte = String colum3

Dann machst du dir ein Objekt tableValues:
Java:
public class TableValues{
String column1;
String column2;
String column3;

public String toString(){
return column1 + " " + column2 + " " column3;
}
}

Schreibst dort dann die Werte rein und packst das in eine
Java:
ArrayList<TableValues> values
.

Für deine Combobox machst du
Java:
tableValues.toString()
und trägst das dort ein. Wenn du einmal über die Tabelle drüber bist machst du
Java:
combobox.setData("tableValues",values);

Wenn ein Wert in der Combobox selektiert wird, holst du dir den Index und machst dann ein
Java:
List<TableValues> values = (List<TableValues>)combobox.getData("tableValues");
TableValues tableValues = values.get(index);
Und weisst somit was in den Spalten stehen soll.
 
Servus,

vielen Dank zeja!
Ich bin einiges weitergekommen. Momentan habe ich noch zwei Punkte, wo ich nicht weiterkomme.
  1. bei der Auswahl eines Comboboxeintrages wird immer der letzte Wert aus der "tmpKundenliste" gezogen
  2. wie bekomme ich es hin, das die einzelnen Strings der Comboboxeinträge alle schön untereineander angzeigt werden

Kann mir jemand bei den 2 Punkten weiterhelfen:
zum besseren Verständis mein bisheriger Code:

Hauptfenster:
Code:
....
private ArrayList<KundenComboboxModell> Kundenliste = new ArrayList<KundenComboboxModell>();  //  @jve:decl-index=0:
...
...	
protected void comboboxFuellen() {

		int gesamtzeilen = table.getItemCount();
		KundenComboboxModell aktKunde = new KundenComboboxModell();
		Kundenliste.clear();
		cCombo.removeAll();
		for (int zeile=0;  zeile< gesamtzeilen; zeile++){
			aktKunde.setKuna(table.getItem(zeile).getText(0));
			aktKunde.setName(table.getItem(zeile).getText(1));		
			aktKunde.setOrt(table.getItem(zeile).getText(2));

			Kundenliste.add(aktKunde);

			cCombo.add(aktKunde.KundeAlsString());
		}

		cCombo.setData("KdCombo", Kundenliste);
}
......

protected void cComboAuswahl() {
		int cComboIndex = cCombo.getSelectionIndex();
		
		ArrayList<KundenComboboxModell> tmpKundenliste = (ArrayList<KundenComboboxModell>)cCombo.getData("KdCombo");
		KundenComboboxModell tmpKunde = tmpKundenliste.get(cComboIndex);
		
		//Test, was in dem Objekt 'tmpKunde' enthalten ist
		text1.setText(tmpKunde.getKuna());
		text2.setText(tmpKunde.getName());
		text3.setText(tmpKunde.getOrt());
		
}
....


das Objekt für die Combobox der Kunden:
Code:
public class KundenComboboxModell extends Kunden{
	private String kuna;
	private String name;
	private String ort;
	
	public String KundeAlsString() {
		   return kuna + " |" + name + " |" + ort;
		}

	public String getKuna() {
		return kuna;
	}

	public void setKuna(String kuna) {
		this.kuna = kuna;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getOrt() {
		return ort;
	}

	public void setOrt(String ort) {
		this.ort = ort;
	}
  
}
 
Du erhälst immer den letzten Eintrag weil du in der for-Schleife kein neues aktKunde-Objekt anlegst sondern nur ein Objekt benutz und dessen Daten immer überschreibst.

Wenn du die ArrayList nicht als Feld nimmst, dann brauchst du auch kein clear und es ist sauberer da du nicht in Versuchung kommst das Feld zu benutzen.

Weiterhin geht es wesentlich schneller wenn du das table.getItem nur einmal aufrufst:
Java:
protected void comboboxFuellen() {
                ArrayList<KundenComboboxModell> kundenliste = new  ArrayList<KundenComboboxModell>();
		int gesamtzeilen = table.getItemCount();
		cCombo.removeAll();
                int col1Length = 0;
                int col2Length = 0;
                int col3Length = 0;
		for (int zeile=0;  zeile< gesamtzeilen; zeile++){
                        KundenComboboxModell aktKunde = new KundenComboboxModell();
                        TableItem item = table.getItem(zeile);
                        col1Length = Math.max(col1Length,item.getText(0).Length());
                        //für die anderen Spalte ebenso
			aktKunde.setKuna(item.getText(0));
			aktKunde.setName(item.getText(1));		
			aktKunde.setOrt(item.getText(2));

			kundenliste.add(aktKunde);

			
		}
                
		for(KundenComboboxModell aktKunde : kundenliste){
                      //Die Methode entsprechend umschreiben. Fehlende Länge mit Leerzeichen
                      //füllen o.ä.
                      cCombo.add(aktKunde.kundeAlsString(col1Length,col2Length,col3Length));
               }

		cCombo.setData("KdCombo", kundenliste);
}

Das mit der Spaltenformatierung hab ich auch mal als Idee hinzugefügt.
 
Zurück