SWT SWT - List - DeSelection Problem

reibi

Top Contributor
Hallo

Ich möchte Euch die 2 folgenden useCases mal demonstrieren:

Fall 1 : ListItem ist ausgewählt, dann wird Enter gedrückt.
- Das Textfeld enthält wie erwartet den in der Liste ausgewählten Text
- Das ListItem wird wie erwartet deselectiert.

Fall 2(PROBLEMFALL) : ListItem ist ausgewählt(0-tes Item), dann wird die "Pfeiltaste nach oben" gedrückt.
- Das Textfeld enthält wie erwartet den in der Liste ausgewählten Text
- Das ListItem wird NICHT! wie erwartet deselectiert. <--- PROBLEM

--> Wo könnte hier das Problem liegen?

Bin schon Tage lage damit beschäftigt und kommt irgendwie nicht weiter.

Bis für jeden Tipp dankbar

Gruß

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;


public class TestList {
    private Shell myShell = null;
    private List myList = null;
    private Text myText = null;
    private Button myButton = null;

    public static void main(String[] args) {
        Display display = Display.getDefault();
        TestList thisClass = new TestList();
        thisClass.createSShell();
        thisClass.myShell.open();

        while (!thisClass.myShell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            } // end if
        } // end while

        display.dispose();
    } // end main()

    private void createSShell() {
        myShell = new Shell();
        myShell.setText("Shell");
        myShell.setSize(new Point(263, 193));
        myList = new List(myShell, SWT.NONE);
        myList.setSize(new Point(190, 82));
        myList.setLocation(new Point(5, 31));

        String[] myStrings = new String[5];

        for (int i = 0; i < myStrings.length; i++) {
            myStrings[i] = "hallo " + i;
        } // end for

        myList.setItems(myStrings);

        myList.addKeyListener(new KeyListener() {
                @Override
                public void keyReleased(KeyEvent arg0) {
                } // end keyReleased()

                @Override
                public void keyPressed(KeyEvent keyEvent) {
                    if (keyEvent.keyCode == SWT.CR) {
                        if (myList.getSelectionIndex() > -1) {
                            myText.setText(myList.getItem(myList.getSelectionIndex()));

                            myList.deselectAll();
                            myText.setFocus();
                        } // end if
                    } // end if

                    if (keyEvent.keyCode == SWT.ARROW_UP) {
                        if (myList.getSelectionIndex() == 0) {
                            myText.setText(myList.getItem(0));
                            myList.deselectAll();
                            myText.setFocus();
                        } // end if
                    } // end if
                } // end keyPressed()
            } // end new
        );

        myText = new Text(myShell, SWT.BORDER);
        myText.setBounds(new Rectangle(6, 7, 190, 19));
        myButton = new Button(myShell, SWT.NONE);
        myButton.setBounds(new Rectangle(78, 122, 115, 23));
        myButton.setText("drück mich");
    } // end createSShell()
} // end TestList
 
Java:
		myList.addKeyListener(new KeyListener() {

			@Override
			public void keyReleased(KeyEvent keyEvent) {
				if (keyEvent.keyCode == SWT.CR) {
					if (myList.getSelectionIndex() > -1) {
						myText.setText(myList.getItem(myList.getSelectionIndex()));

						myList.deselectAll();
						myText.setFocus();
					} // end if
				} // end if
				if (keyEvent.keyCode == SWT.ARROW_UP) {
					if (myList.getSelectionIndex() == 0) {
						myText.setText(myList.getItem(0));
						myList.deselectAll();
						myText.setFocus();
					} // end if
				} // end if
			} // end keyReleased()

			@Override
			public void keyPressed(KeyEvent keyEvent) {
			} // end keyPressed()
		} // end new
		);

Damit wird das von dir gewünschte Verhalten durchgeführt

[EDIT]
Das Problem in deinem Fall war, dass du die deslektierung in der Methode "keyPressed" gemacht hast, statt in der Methode "keyReleased"
[/EDIT]
 
Zuletzt bearbeitet:
Hallo Sonecc

Sehr interessanter Tip - is aber nich ganz meine Idee.

Das Nullte Item soll schon mit der Pfeiltaste selectiert werden können, erst wenn danach die Pfeil-OBEN-taste gedrückt wird, soll die Aktion passieren.
Weiss nich wie ich das mit keyreleased hinkriegen soll

Haste noch ne Idee?


Grüsse ;-)
 
Java:
		myList.addKeyListener(new KeyListener() {

			@Override
			public void keyReleased(KeyEvent keyEvent) {
				Integer lastSelectionIndex = (Integer) myList.getData("lastSelectionIndex");
				myList.setData("lastSelectionIndex", Integer.valueOf(myList.getSelectionIndex()));
				if (keyEvent.keyCode == SWT.CR) {
					if (myList.getSelectionIndex() > -1) {
						myText.setText(myList.getItem(myList.getSelectionIndex()));

						myList.deselectAll();
						myText.setFocus();
					} // end if
				} // end if
				if (keyEvent.keyCode == SWT.ARROW_UP) {
					if (lastSelectionIndex != null && lastSelectionIndex.intValue() == 0 || lastSelectionIndex == null) {
						if (myList.getSelectionIndex() == 0) {
							myText.setText(myList.getItem(0));
							myList.deselectAll();
							myText.setFocus();
						} // end if
					}
				} // end if
			} // end keyReleased()

			@Override
			public void keyPressed(KeyEvent keyEvent) {
			} // end keyPressed()
		} // end new
		);

Der Trick ist, die letzte Selection zu sichern und entsprechend zu prüfen

Zu beachten ist allerdings, dass das ganze weiterhin in der keyReleased Methode geschehen muss
 
mit dem "setData" hab ich wieder was gelernt.

Klasse Sache was man alles machen kann - wär ich allein NIE drauf gekommen.

;-)
 

Neue Themen


Zurück
Oben