In editierbarer SWT Tabelle ohne Eingabe von ENTER Werte ändern

Tobias1982

Grünschnabel
Hallo,

ich habe hier schon mehrmals Beiträge gelesen, die mir bei der Erstellung meiner Diplomarbeit wertvolle Hinweise geliefert haben - erst einmal vielen Dank für eure Aktivität

Jetzt habe ich allerdings ein Problem, auf das ich keine Lösung gefunden habe:

Ich möchte, dass Nutzen in einer SWT Tabelle mit den Pfeiltasten navigieren und Werte eingeben können. Das klappt auch mit folgendem Code:

Code:
	// create a TableCursor to navigate around the table
		final TableCursor cursor = new TableCursor(table, SWT.NONE);
		// create an editor to edit the cell when the user hits "ENTER" 
		// while over a cell in the table
		final ControlEditor editor = new ControlEditor(cursor);
		editor.grabHorizontal = true;
		editor.grabVertical = true;
	
		cursor.addSelectionListener(new SelectionAdapter() {
			// when the TableEditor is over a cell, select the corresponding row in 
			// the table
			public void widgetSelected(SelectionEvent e) {
				table.setSelection(new TableItem[] {cursor.getRow()});
			}
			// when the user hits "ENTER" in the TableCursor, pop up a text editor so that 
			// they can change the text of the cell
			public void widgetDefaultSelected(SelectionEvent e){
				final Text text = new Text(cursor, SWT.NONE);
				TableItem row = cursor.getRow();
				int column = cursor.getColumn();
				text.setText(row.getText(column));
				text.addKeyListener(new KeyAdapter() {
					public void keyPressed(KeyEvent e) {
						// close the text editor and copy the data over 
						// when the user hits "ENTER"
						if (e.character == SWT.CR) {
							TableItem row = cursor.getRow();
							int column = cursor.getColumn();
							row.setText(column, text.getText());
							text.dispose();
						}
						// close the text editor when the user hits "ESC"
						if (e.character == SWT.ESC) {
							text.dispose();
						}
					}
				});
				editor.setEditor(text);
				text.setFocus();
			}
		});

Alleridngs ist es für Nutzer relativ ungewohnt vorher und nachher immer Enter drücken zu müssen - habt ihr vielleicht eine Idee?

Vielen Dank schon Mal im Voraus
 
Normalerweise selektiert man den Wert wenn man die Zelle erreicht und bietet den Wert zum überschreiben an und speichert den Wert wenn man die Zelle wieder verlässt. Warum machst du das nicht so?
 
Das ist genau das was ich möchte - im Prinzip sollten Zellen so bearbeitet werden können wie in Excel - leider habe ich keine Ahnung wie das geht.

Ich habe Code-Beispiele gefunden wie obiges, bei denen man immer zuerst mit Enter bestätigen muss und welche bei denen man immer zuerst mit der Maus in die Zelle klicken muß - allerdings nicht mehr mit den Pfeiltasten navigieren kann.
 
Hi
Benutz doch einfach einen anderen Listener. Vll einen, der beim Verlassen des Textfeldes reagiert.
 
Das hab ich auch schon versucht - aber irgendwie bekomme ich das nicht so hin, wie ich es gerne hätte.

Mein (ansonsten) so schlaues Buch "The definite Guide to SWT and JFace" das ich ansonsten auch nur wärmstens empfehlen kann läßt mich hier auch im Stich.

Habe auch schon alle möglichen Foren durchsucht - wenn ich einmal ein Thema finde, bei dem das angesprochen wurde, gibt es entweder keine Lösung oder die Lösung wurde nicht gepostet.
 
Hallo Tobias,

wie Tobi schon sagte, mußt du einen anderen Listener verwenden.... Möglich ist das ganze über einen KeyListener, wobei Du aber nicht mit jeder das Feld editieren willst. Daher mußt Du alle Tasten in 2 Blöcke unterteilen:
1.) Die die Zelle editieren
2.) Die einfach ignoriert werden
sollen.


Hier mal ein schnelles Beispiel. Ersetze einfach Dein cursor.addSelectionListener durch Folgendes:
Java:
cursor.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				switch(e.keyCode) {
				case SWT.ARROW_UP:
				case SWT.ARROW_RIGHT:
				case SWT.ARROW_DOWN:
				case SWT.ARROW_LEFT:
				//an dieser stelle fehlen auch noch alle anderen tasten die
				//ignoriert werden sollen...wie F1-12, esc,bsp,....	
					System.out.println("Taste ignorieren...");
					break;
					
				default:
					System.out.println("hier jetzt text editieren");
					final Text text = new Text(cursor, SWT.NONE);
					TableItem row = cursor.getRow();
					int column = cursor.getColumn();
					text.setText("");
					text.addKeyListener(new KeyAdapter() {
						public void keyPressed(KeyEvent e) {
							// close the text editor and copy the data over 
							// when the user hits "ENTER"
							if (e.character == SWT.CR) {
								TableItem row = cursor.getRow();
								int column = cursor.getColumn();
								row.setText(column, text.getText());
								text.dispose();
							}
							// close the text editor when the user hits "ESC"
							if (e.character == SWT.ESC) {
								text.dispose();
							}
						}
					});
					editor.setEditor(text);
					text.setFocus();
						break;
					}	
			}
		});
 
Zuletzt bearbeitet von einem Moderator:
Hallo!

Vielen Dank! Du hast mir schon einmal sehr geholfen.

Das einzige was noch nicht passt, ist, dass man am Ende Enter drücken muss um in die nächste Zelle zu gelangen. Das wird doch durch das SWT.CR in diesem Code ausgelöst, oder?

Code:
if (e.character == SWT.CR) {
								TableItem row = cursor.getRow();
								int column = cursor.getColumn();
								row.setText(column, text.getText());
								text.dispose();
							}

Ich habe versucht, das SWT.CR durch SWT.ARROW_RIGHT zu erstzen - es tut sich aber nichts.

Hast du ne Idee woran das liegt?
 
Was mir gerade erst aufgefallen ist: Wenn ich in eine Zelle möchte wird der erste Tastendruck verwendet um den Editor zu öffnen, d.H. gibt man 123 ein wird nur 23 eingegeben, da 1 den Editor öffnet.
 
Ich habe versucht, das SWT.CR durch SWT.ARROW_RIGHT zu erstzen - es tut sich aber nichts.

Hast du ne Idee woran das liegt?

Das liegt wahrscheinlich daran, dass der CursorListener greift und die Taste dadurch ignoriert wird..... Habe das Projekt jetzt nicht hier, um es auszuprobieren, aber laß Dir bei:
Java:
switch(e.keyCode) {
  case SWT.ARROW_UP: System.out.println("UP");
  ...
einfach mal was auf der Konsole ausgeben. Wenn Du dann die Zelle mit Taste nach oben verlassen willst, gibt er Dir was aus? ==> Dann greift der cursorlistener.....

Was das andere angeht, so mußt Du die Eingabe bei Tastendruck einfach zwischenspeichern und dann das erste Zeichen gleich dem Editor übergeben....
 
Zuletzt bearbeitet von einem Moderator:
Habe den Code jetzt so angepasst:

Code:
cursor.addKeyListener(new KeyAdapter() {
				            public void keyPressed(KeyEvent e) {
				            	char tempChar;
		                        tempChar = e.character;
				                switch(e.keyCode) {
				                case SWT.ARROW_UP: System.out.println("UP");
				                case SWT.ARROW_RIGHT:
				                case SWT.ARROW_DOWN:
				                case SWT.ARROW_LEFT:
				                //an dieser stelle fehlen auch noch alle anderen tasten die
				                //ignoriert werden sollen...wie F1-12, esc,bsp,.... 
				                   // System.out.println("Taste ignorieren...");
				                    break;
				                    
				                default:
				                  //  System.out.println("hier jetzt text editieren");
				                    final Text text = new Text(cursor, SWT.NONE);
				                   
				                	TableItem row = cursor.getRow();
				                    int column = cursor.getColumn();
				                    text.setText(row.getText(column)+tempChar);
				                    text.addKeyListener(new KeyAdapter() {
				                        public void keyPressed(KeyEvent e) {

				                            // close the text editor and copy the data over 
				                            // when the user hits "ENTER"
				                            if (e.character == SWT.CR) {
				                                TableItem row = cursor.getRow();
				                                int column = cursor.getColumn();
				                                row.setText(column, (text.getText()));
				                                text.dispose();
				                            }
				                            // close the text editor when the user hits "ESC"
				                            if (e.character == SWT.ESC) {
				                                text.dispose();
				                            }
				                        }
				                    });
				                    editor.setEditor(text);
				      
				                    text.setFocus();
				                        break;
				                    }   
				            }
				        });

Wenn ich mich in der Zelle beim Ediieren befinde, gibt die Konsole nichts aus - in der Zellr hat der Nach-Oben-Pfeil die gleiche Funktion wie der Links-Pfeil.

Das Problem mit dem Zwischenspiechern:
Ich hole mir jetzt den Zelleninhalt und etzte das erste Zeichen dran - leider ist es so, dass der Corsor in der Zelle ganz links ist, so dass das erste Zeichen an den Schluss rutscht.
 
Zurück