In editierbarer SWT Tabelle ohne Eingabe von ENTER Werte ändern

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:
Java:
text.setText(row.getText(column)+tempChar);

schreib mal:
Java:
text.append(String.valueOf(e.character));


Der Übersicht halber hier noch einmal eine komplette TestDatei:
Java:
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();
		}
	}

}
 
Zuletzt bearbeitet von einem Moderator:
Hi!

Vielen Dank!

Hast mir wirklich sehr geholfen!

Ich hab deinen code noch leicht abgeändert:

Code:
 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.
 
Zurück