In einer editierbaren Tabelle mit Tab oder Enter durch die Spalten navigieren

KlaDi

Erfahrenes Mitglied
Hallo,

ich habe mir nach dem Beispiel von java2s.com eine Tabelle angelegt, die editerbar ist. Das Beispiel ist hier zu finden: http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/TableEditorexample.htm
Nun möchte ich gerne wenn ich die Tabelle editiere mit Tabulator oder Enter von einer Spalte in die nächste springen bzw. wenn ich in der letzten Spalte bin möchte ich in die neue Zeile kommen.

Kann ich das über einen Keylistener realisieren oder gibt es dafür schon eine Möglichkeit?

Gruß KlaDi.
 
Hallo,
Code:
public void handleEvent(final Event e) {
                  switch (e.type) {
                  case SWT.FocusOut:
                    item.setText(column, text.getText());
                    text.dispose();
                    break;
                  case SWT.Traverse:
                    switch (e.detail) {
                    case SWT.TRAVERSE_RETURN:
                      item
                          .setText(column, text
                              .getText());
                    //FALL THROUGH
                    case SWT.TRAVERSE_ESCAPE:
                      text.dispose();
                      e.doit = false;
                      break;
                    }
                    case SWT.TRAVERSE_TAB_NEXT:
                       int zeile = table.getSelectionIndex();
                       table.select(zeile+1);
                       e.doit = false;
                       break;
                  }
                }

gruß Drakon
 
Hallo Drakon,

danke erstmal für Deine Hilfe.

Nur leider ist es noch nicht ganz, das was ich haben will. Und zwar wird in Deinem Beispiel Zeilenweise navigiert. Ich möchte aber durch die Spalten und wenn das Ende der Zeile erreicht ist durch die Spalten navigieren. Und die Zelle soll direkt aktiviert sein, wenn ich hineinspringen.
Hab den Code schonmal angefangen zu modifizieren, leider klappt es aber noch nicht.
Code:
public void handleEvent(final Event e) {
	switch (e.type) {
		case SWT.FocusOut:
			item.setText(column, text.getText());
			text.dispose();
			break;							case SWT.Traverse:
			switch (e.detail) {
				case SWT.TRAVERSE_RETURN:
					item.setText(column, text.getText());
				//FALL THROUGH
				case SWT.TRAVERSE_ESCAPE:
					text.dispose();
					e.doit = false;
					break;
				case SWT.TRAVERSE_TAB_NEXT: 
					item.setText(column, text.getText());
					if(column < (paTable.getColumnCount()-1)) {
						item.setText(column+1, text.getText());
					} else {
						if(paTable.getSelectionIndex() <  (paTable.getItemCount()-1)) {
							int zeile = paTable.getSelectionIndex();
									paTable.setSelection(zeile+1);
							item.setText(0, text.getText());
						} else {
									paTable.setSelection(0);
							item.setText(0, text.getText());
						}
					}
					e.doit = false;
					break;
			}
		}
	}

gruß klaus.
 
Hallo,

versuch doch mal:

final TableCursor cursor = new TableCursor(table, SWT.NONE);

damit kannst du dann mit den Tasten navigieren. Musst aber die Tab Tast noch seperat
abfangen. Die Klasse TableCursor stellt aber ein Methode

cursor.getColumn();

bereit, die dir die ausgewählte Spalte angibt.
sollte in etwa so funktionieren:
Code:
final TableCursor cursor = new TableCursor(table, SWT.NONE);
cursor.addTraverseListener(new TraverseListener(){
		public void keyTraversed(TraverseEvent e) {
			int aktuelleSpalte = cursor.getColumn();
			int aktuelleZeile = tabelle.getSelectionIndex();
			if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
				// aktiviert naechste Zeile
				int nextColIdx = aktuelleSpalte + 1;
				cursor.setSelection(aktuelleZeile, nextColIdx);
				e.doit = false;
			}
			// Shift & Tab fuunktinalität in der Tabelle
			if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
				int nextColIdx = aktuelleSpalte - 1;
				tabelle.select(aktuelleZeile);
				cursor.setSelection(aktuelleZeile, nextColIdx);
				e.doit = false;
			}
		}
	});

Gruß Drakon
 
Danke.

Mit dem Code:

Code:
final TableCursor cursor = new TableCursor(paTable, SWT.NONE);
		
		cursor.addTraverseListener(new TraverseListener(){
				public void keyTraversed(TraverseEvent e) {
		
					int aktuelleSpalte = cursor.getColumn();
					int aktuelleZeile = paTable.getSelectionIndex();
					
					if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
						if(aktuelleSpalte < (paTable.getColumnCount()-1)) {
							// aktiviert naechste Spalte
							int nextColIdx = aktuelleSpalte + 1;
							cursor.setSelection(aktuelleZeile, nextColIdx);
						} else {
							if(paTable.getSelectionIndex() < (paTable.getItemCount()-1)) {
								cursor.setSelection(aktuelleZeile+1, 0);
								paTable.setSelection(aktuelleZeile+1);
							} else {
								cursor.setSelection(0, 0);
								paTable.setSelection(0);
							}
						}
						e.doit = false;
					}
					
					// Shift & Tab fuunktinalität in der Tabelle
					if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
						if(aktuelleSpalte > 0) {
							int nextColIdx = aktuelleSpalte - 1;
							paTable.select(aktuelleZeile);
							cursor.setSelection(aktuelleZeile, nextColIdx);
						} else {
							if(aktuelleZeile > 0) {
								cursor.setSelection(aktuelleZeile-1, paTable.getColumnCount()-1);
							paTable.setSelection(aktuelleZeile-1);
							} else {
								cursor.setSelection(paTable.getItemCount()-1, paTable.getColumnCount()-1);
								paTable.setSelection(paTable.getItemCount()-1);
							}
						}
						e.doit = false;
					}
				}

			});
kann ich schonmal problemlos durch meine Tabelle navigieren auf Tab bzw. Shift & Tab, jetzt muss ich es nur noch hinbekommen, das die Zellen auch editiert werden können.

gruß Klaus.
 
Hallo,

also irgendwie bekomme ich es nicht hin, das ich auch die einzelnen Zellen editieren kann, hat vielleicht noch jemand ne Idee?

gruß klaus.
 
Halllo,

das habe ich jetzt:
Code:
public static void createTableEditor(final Table paTable) {
		
		final TableEditor editor = new TableEditor(paTable);
		editor.horizontalAlignment = SWT.LEFT;
		editor.grabHorizontal = true;
		paTable.addListener(SWT.MouseDown, new Listener() {
	      public void handleEvent(Event event) {
	        Rectangle clientArea = paTable.getClientArea();
	        Point pt = new Point(event.x, event.y);
	        int index = paTable.getTopIndex();
	        while (index < paTable.getItemCount()) {
	          boolean visible = false;
	          final TableItem item = paTable.getItem(index);
	          for (int i = 0; i < paTable.getColumnCount(); i++) {
	            Rectangle rect = item.getBounds(i);
	            if (rect.contains(pt)) {
	              final int column = i;
	              final Text text = new Text(paTable, SWT.NONE);
	              Listener textListener = new Listener() {
	                public void handleEvent(final Event e) {
	                  switch (e.type) {
	                  case SWT.FocusOut:
	                    item.setText(column, text.getText());
	                    text.dispose();
	                    break;
	                  case SWT.Traverse:
	                    switch (e.detail) {
	                    	case SWT.TRAVERSE_RETURN: item.setText(column, text.getText());
	                    	//FALL THROUGH
	                    	case SWT.TRAVERSE_ESCAPE: text.dispose();
	                    								e.doit = false;
	                    	case SWT.TRAVERSE_TAB_NEXT : item.setText(column, text.getText());
	                    									int aktuelleSpalte = editor.getColumn();
	                    									int aktuelleZeile = paTable.getSelectionIndex();
	                    									if(aktuelleSpalte < (paTable.getColumnCount()-1)) {
	                    										// aktiviert naechste Spalte
	                    										int nextColIdx = aktuelleSpalte + 1;
	                    										editor.setColumn(nextColIdx);
	                    									} else {
	                    										if(paTable.getSelectionIndex() < (paTable.getItemCount()-1)) {
	                    											editor.setColumn(0);
	                    											paTable.setSelection(aktuelleZeile+1);
	                    										} else {
	                    											editor.setColumn(0);
	                    											paTable.setSelection(0);
	                    										}
	                    									}
	                    									e.doit = false;
	                    									break;
	                    	case SWT.TRAVERSE_PAGE_PREVIOUS: item.setText(column, text.getText());
	                    										aktuelleSpalte = editor.getColumn();
	                    										aktuelleZeile = paTable.getSelectionIndex();
	                    										if(aktuelleSpalte > 0) {
	                    											int nextColIdx = aktuelleSpalte - 1;
	                    											paTable.select(aktuelleZeile);
	                    											editor.setColumn(nextColIdx);
																} else {
																	if(aktuelleZeile > 0) {
																		editor.setColumn(paTable.getColumnCount()-1);
																		paTable.setSelection(aktuelleZeile-1);
																	} else {
																		editor.setColumn(paTable.getColumnCount()-1);
																		paTable.setSelection(paTable.getItemCount()-1);
																	}
																}
																e.doit = false;
																break;
	                    }
	                    break;
	                  }
	                }
	              };
	              text.addListener(SWT.FocusOut, textListener);
	              text.addListener(SWT.Traverse, textListener);
	              editor.setEditor(text, item, i);
	              text.setText(item.getText(i));
	              text.selectAll();
	              text.setFocus();
	              return;
	            }
	            if (!visible && rect.intersects(clientArea)) {
	              visible = true;
	            }
	          }
	          if (!visible)
	            return;
	          index++;
	        }
	      }
	    });
	}

ich kann jetzt mit Tab durch die Zellen navigieren, springe aber nicht, wenn ich die letzte Zelle der Zeile erreicht habe in die nächste Zeile, sondern in die erste Zelle derselben Zeile und wenn ich in der Zelle was eingeben und anschließend mit Tab in die nächste springe, dort etwas eingebe und wieder mit Tab weterspringe, dann wird mein Text aus der ersten Zelle gelöscht und durch den zuletzt eingegeben Text ersetzt.
Weiß jemand vielleicht woran das lieft? Oder wie ich es hinbekomme, das ich auch durch die Zeilen springen?

gruß klaus.
 
Habe genau das gleiche Problem wie du hattest - hast du das Problem mittlerweile lösen können?

Wenn ja, würdest du vielleicht den Code posten?

DANKE!
 
Zurück