tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
2788
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tobias1982 Tobias1982 ist offline Rookie
    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
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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?
     

  3. #3
    Tobias1982 Tobias1982 ist offline Rookie
    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.
     

  4. #4
    Tobias Köhler Tutorials.de Gastzugang
    Hi
    Benutz doch einfach einen anderen Listener. Vll einen, der beim Verlassen des Textfeldes reagiert.
     

  5. #5
    Tobias1982 Tobias1982 ist offline Rookie
    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.
     

  6. #6
    Ronin-Jay Ronin-Jay ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    235
    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;
                        }   
                }
            });
     

  7. #7
    Tobias1982 Tobias1982 ist offline Rookie
    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?
     

  8. #8
    Tobias1982 Tobias1982 ist offline Rookie
    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.
     

  9. #9
    Ronin-Jay Ronin-Jay ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    235
    Zitat Zitat von Tobias1982 Beitrag anzeigen
    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:
    Code java:
    1
    2
    3
    
    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....
     

  10. #10
    Tobias1982 Tobias1982 ist offline Rookie
    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.
     

  11. #11
    Ronin-Jay Ronin-Jay ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    235
    Zitat Zitat von Tobias1982 Beitrag anzeigen
    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)
     

  12. #12
    Tobias1982 Tobias1982 ist offline Rookie
    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

  1. Werte der Auswahlliste ändern ohne Seite neu zu laden?
    Von dsolianyi im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 06.04.08, 01:51
  2. Antworten: 9
    Letzter Beitrag: 13.01.08, 14:50
  3. Auf Eingabe/Enter reagieren
    Von _Dome_ im Forum Borland CBuilder und VCL
    Antworten: 3
    Letzter Beitrag: 07.02.07, 17:51
  4. JTable: Werte speichern ohne "Enter"
    Von Dinosaurus im Forum Java
    Antworten: 3
    Letzter Beitrag: 22.06.06, 11:04
  5. Werte einer Tabelle durch Werte anderer Tabelle ersetzen
    Von Oremliac im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 28.01.04, 21:21