# SWT Combo getSelectionIndex() immer -1?



## Combodombo (11. Dez 2011)

Hi,

ich benutze eine SWT Combo Control um ein DropDown-Menu zu realiseren. Ich habe einige Werte darin zur Auswahl und das funktioniert auch soweit, also die Combo-Control ist bedienbar.

Nun möchte ich gerne, dass man einfach dne Text ändern und kann und dass dann bei Enter-Eingabe übernommen wird. Dafür habe ich einen KeyListener hinzugefügt wo ich dann mit getSelectionIndex() den aktuellen Wert, der ausgewählt ist, abfragen will. Das dumme ist, ich erhalte immer -1 als Rückgabewert.

Mein Problem ist jetzt, dass ich diesen Index brauche, da die String-Werte in der Combo-Box nicht eindeutig sind und mehrmals vorkommen können.


```
@Override
	public void keyPressed(KeyEvent e) {

		if (e.keyCode == SWT.CR) {
			Combo c = (Combo) e.getSource();
			c.update();
			String [] sadfds = c.getItems();
			String asd = c.getText();
			Point p = c.getSelection();
			int i = c.getSelectionIndex(); //<---- immer -1, wieso?
```

Jemand eine Idee warum getSelectionIndex() immer -1 zurückliefert?


----------



## Madlip (11. Dez 2011)

zu nächst würde ich dir empfehlen nen ComboViewer zu nehmen und warum willst du unbedingt bei einer enter eingabe erst den wert übernehmen? du kannst ja dann auch über den ComboViewer machen indem du da nen SelectionListener drüber hängst.


----------



## 34erafsdyxc (11. Dez 2011)

Naja, der ComboViewer nimmt doch intern auch ein Combo?

Das ändern soll erst dann passieren, falls man Eingabe drückt, falls man es sich anders überlegt und doch nicht umbenennen will.
Es muss doch auch bei einem ComboViewer möglich sein zu erfragen welches Element der Eingabedaten grade das aktive ist? Also welches Element momentan ausgewählt ist?


----------



## Madlip (11. Dez 2011)

sorry bevor ich jetzt hier eine unqualifizierte antwort geben, werd ich es morgen selber mal probieren ...


----------



## bERt0r (11. Dez 2011)

> c.update();


Was soll denn das bewirken?


----------



## Sonecc (12. Dez 2011)

Zuerstmal, das c.update() machste mal wieder weg, das macht dort keinen Sinn.

Der SelectionIndex ist zu dem Zeitpunkt deswegen immer -1, weil der Benutzer nichts ausgewählt hat.
Der SelectionIndex ändert sich mit dem verändern des Textes, weil dieser nicht mehr dem ursprünglichen Text entspricht.
Dementsprechend musst du per SelectionListener den Index abholen, sichern und später verwenden.


----------



## alsdkfj (12. Dez 2011)

ich hab jetzt sehr viel mit der combo gekämpft, also den "puren" control. Ich hab aus Verzweiflung jetzt den ComboViewer genommen, wie oben vorgeschlagen.

Mein Problem ist, dass ich (jetzt doch) nach jedem Tastenschlag die Änderung in mein Modell übernehmen will. Dafür hab ich mir einen jetzt keyListener auf die Combo-Control draufgelegt, die den ComboViewer kennt.

Dadurch hatte ich gehofft, ich konnte auf keyeingabe etwas unkomplizierter auf den aktuellen Eintrag der Komboliste zugreifen, leider Pustekuchen.

Sieht jemand was ich falsch mache? Die Selection ist immer nur beim ersten mal gefüllt, nachfolgende Eingabe 


```
public class ComboKeyListener implements KeyListener {

	private ComboViewer combo;

	private TreeNode node;

	public ComboKeyListener(ComboViewer combo) {
		this.combo = combo;
	}

	@Override
	public void keyPressed(KeyEvent e) {

		ISelection selection = combo.getSelection(); //<- beim ersten Tastenschlag ist hier etwas drin, biem zweiten und nachfolgenden nicht mehr

		if (selection instanceof IStructuredSelection) {

			IStructuredSelection strucSel = (IStructuredSelection) selection;

			node = (TreeNode) strucSel.getFirstElement();
        
		}

	}

	@Override
	public void keyReleased(KeyEvent e) {

		if (node != null) {

			Combo control = (Combo) e.getSource();
			String newBookmarkName = control.getText();

			if (newBookmarkName.compareTo((String) node.getValue()) == 0) {
				node = null;
				return;
			}
			node.setValue(newBookmarkName);

			ISelection sel = new StructuredSelection(node);
			combo.setSelection(sel);
			node = null;
		}
	}
```


----------



## afdf (12. Dez 2011)

combo.getInput() liefert mir zwar das aktuelle objekt auf dem ich im listener arbeite, aber vor der Verarbeitung. ich bekomme als die Veränderung nicht mit


----------



## Sonecc (13. Dez 2011)

Also erstmal ist das von dir gewünschte Verhalten mehr als ungewöhnlich und meiner Meinung nach absolut gefährlich, weil versehentliche Änderungen direkt übernommen werden.

Was du willst ist wohl folgendes:
Der Benutzer wählt ein Objekt aus und soll dieses dann umbenennen können. Die Änderung soll sofort in der combo übernommen werden.

Für diesen Zweck empfiehlt es sich eine Textbox zu verwenden, deren Inhalt immer der aktuellen Selektion entspricht. (Benutzer wählt Item 1 aus, also steht Item 1 in der TextBox)
Hier kannst du nun einen Listener anlegen, der die Änderungen verarbeitet und diese direkt in der Combo aktualisiert.

Nur als Vorschlag


----------



## aksdfjsd (13. Dez 2011)

ich hab viel rumprobiert, dass ist wirklich nicht gut. Die Listener feuern sich gegenseitig kaputt und wer weis welche Randbedingungen ich da noch übersehen habe....

Meine ursprüngliche Idee war es, drum herum zu kommen ein eWarnung oder einen "änderungen speichern" dialog zu mchen, wenn man anfängt zu editieren - daher halt die idee alles zu speichern was getippt wird.
Als Work-Around dachte ich mir, ob man nicht den tooltip text erzwingen kann? Sobald man tippt poppt der tooltip mit auf "enter zum speichern" oder so ähnlich.
Geht das?


----------



## Sonecc (13. Dez 2011)

Create fake tooltips for items in a SWT table : TooltipsSWT JFace EclipseJava

Müsste auch auf deine Idee umsetzbar sein


----------

