ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
2788
2788
EMPFEHLEN
-
30.12.07 13:37 #1
- Registriert seit
- Nov 2007
- Beiträge
- 9
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
// 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?
-
02.01.08 09:47 #3
- Registriert seit
- Nov 2007
- Beiträge
- 9
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.
-
02.01.08 09:53 #4Tobias Köhler Tutorials.de Gastzugang
Hi
Benutz doch einfach einen anderen Listener. Vll einen, der beim Verlassen des Textfeldes reagiert.
-
02.01.08 10:35 #5
- Registriert seit
- Nov 2007
- Beiträge
- 9
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:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
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; } } });
-
04.01.08 12:10 #7
- Registriert seit
- Nov 2007
- Beiträge
- 9
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 :1 2 3 4 5 6
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?
-
04.01.08 17:42 #8
- Registriert seit
- Nov 2007
- Beiträge
- 9
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.
-
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:
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.....Code java:1 2 3
switch(e.keyCode) { case SWT.ARROW_UP: System.out.println("UP"); ...
Was das andere angeht, so mußt Du die Eingabe bei Tastendruck einfach zwischenspeichern und dann das erste Zeichen gleich dem Editor übergeben....
-
04.01.08 19:15 #10
- Registriert seit
- Nov 2007
- Beiträge
- 9
Habe den Code jetzt so angepasst:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
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.
-
Hallo Tobias,
das liegt daran, dass Du .setText verwendest.
Statt:
Code java:1
text.setText(row.getText(column)+tempChar);
schreib mal:
Code java:1
text.append(String.valueOf(e.character));
Der Übersicht halber hier noch einmal eine komplette TestDatei:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ControlEditor; import org.eclipse.swt.custom.TableCursor; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class CursorNavigation { private static Table table; /** * Launch the application * @param args */ public static void main(String[] args) { final Display display = Display.getDefault(); final Shell shell = new Shell(); shell.setLayout(new GridLayout()); shell.setSize(500, 375); shell.setText("SWT Application"); shell.open(); table = new Table(shell, SWT.BORDER); table.setLinesVisible(true); table.setHeaderVisible(true); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); final TableColumn newColumnTableColumn = new TableColumn(table, SWT.NONE); newColumnTableColumn.setWidth(100); newColumnTableColumn.setText("spalte 1"); final TableColumn newColumnTableColumn_1 = new TableColumn(table, SWT.NONE); newColumnTableColumn_1.setWidth(100); newColumnTableColumn_1.setText("spalte 2"); final TableColumn newColumnTableColumn_2 = new TableColumn(table, SWT.NONE); newColumnTableColumn_2.setWidth(100); newColumnTableColumn_2.setText("spalte 3"); final TableItem newItemTableItem_1 = new TableItem(table, SWT.BORDER); newItemTableItem_1.setText(2, "wer"); newItemTableItem_1.setText(1, "fgg"); newItemTableItem_1.setText(0, "f"); final TableItem newItemTableItem_2 = new TableItem(table, SWT.BORDER); newItemTableItem_2.setText(2, "asdg \n asd"); newItemTableItem_2.setText(1, "fds"); newItemTableItem_2.setText(0, "sad"); final TableItem newItemTableItem_3 = new TableItem(table, SWT.BORDER); newItemTableItem_3.setText(2, "oho"); newItemTableItem_3.setText(1, "aka end"); newItemTableItem_3.setText(0, "aha"); //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.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.append(String.valueOf(e.character)); 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; } } }); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } }
Geändert von Ronin-Jay (07.01.08 um 08:19 Uhr)
-
07.01.08 09:08 #12
- Registriert seit
- Nov 2007
- Beiträge
- 9
Hi!
Vielen Dank!
Hast mir wirklich sehr geholfen!
Ich hab deinen code noch leicht abgeändert:
Code :1
text.append(row.getText(column)+String.valueOf(e.character));
Damit ich, wenn in der Zelle bereits was stand, den Inhalt nicht überschreibe.
Das einzige was mir jetzt noch fehlt:
Wenn man sich beim letzten Zeichen einer Zelle befindet und den Pfeil nach links betätigt, man in die nächste Zelle hüpft.
Ähnliche Themen
-
Werte der Auswahlliste ändern ohne Seite neu zu laden?
Von dsolianyi im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 06.04.08, 01:51 -
[c++] eingabe eines zeichens ohne bestätigung durch 'enter'
Von R3VOLT im Forum C/C++Antworten: 9Letzter Beitrag: 13.01.08, 14:50 -
Auf Eingabe/Enter reagieren
Von _Dome_ im Forum Borland CBuilder und VCLAntworten: 3Letzter Beitrag: 07.02.07, 17:51 -
JTable: Werte speichern ohne "Enter"
Von Dinosaurus im Forum JavaAntworten: 3Letzter Beitrag: 22.06.06, 11:04 -
Werte einer Tabelle durch Werte anderer Tabelle ersetzen
Von Oremliac im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 28.01.04, 21:21





Zitieren


Login





