# In JTable neue Zeile mit Tabulator einfügen



## Enton (5. Jan 2010)

Hallo,
ich habe eine JTable und möchte erreichen, dass bei betätigen der Tabulator-Taste am Ende der Tabelle automatisch eine neue leere Zeile eingefügt wird und der Fokus in die erste Spalte der neuen Zeile gesetzt wird. Wie kann ich das realisieren? Gibt es einen Listener mit dem das umzusetzen ist?
Vielen Dank


----------



## Enigma228 (5. Jan 2010)

Wie wäre es, wenn du die Tabelle mit einem KeyListener verbindest(z.B. eine Innere Klasse MyKeyListener implements KeyListener) und dort das Tab-Key abfängst. Dann prüfst du die Position in der Tabelle und wenns letzte Zeile und Spalte ist, gibst du der Tabelle eine neue Zeile positionierst den Focus auf neueZeile erste Spalte!

Alternativ kannst du das auch mit dem KeyAdapter machen..


----------



## Enton (6. Jan 2010)

Hi,
danke, der KeyListener hilft mir auf jeden Fall weiter. Es funktioniert jetzt auch, wenn ich eine Eingabe in dem Feld mache und anschließend den Tabulator drücke, wenn ich aber keine neue Eingabe mache, komme ich bei Eingabe des Tabulators wieder an den Anfang der Tabelle. Benötige ich evtl. die Methode

```
table.setFocusTraversalKeysEnabled(false);
```
? Ich habe sie vor meinem Eventhandler gesetzt, bemerke aber keinerlei Veränderung. Die Methode habe ich auch noch nicht wirklich verstanden. Aber ich habe irgendwas gelesen, dass Tabulator und Eingabe-Taste eine Ausnahme bilden, da sie ja bereits zum springen in der Tabelle verwendet werden. 
Ich glaube zwar nicht, dass es hilft aber hier mein Quellcode:

```
table.setFocusTraversalKeysEnabled(true);
		//Key-Event fängt "Tabulator" in der letzten Zelle ab und legt ggf. neue Zeile an.
		table.addKeyListener(
				new KeyListener(){
					public void keyPressed(KeyEvent e) {
						//falls letztes Feld in der Tabelle
						if(table.getEditingColumn() == table.getColumnCount()-1 &&
                                                   table.getEditingRow() == table.getRowCount()-1){
							//falls Tabulator gedrückt wird
							if(e.getKeyCode() == 9){
								Object[] data = {tableModel.getRowCount()+1,"", ""};
								tableModel.addRow(data);
							}
						}
				        }
					public void keyReleased(KeyEvent arg0) {	
					}
					public void keyTyped(KeyEvent arg0) {
					}
				});
```


----------



## Enigma228 (6. Jan 2010)

```
import java.awt.HeadlessException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;


public class Main_Table extends JFrame {

	/**
	 * @param args
	 */
	private JTable table;
	private JScrollPane sp_table;
	private DefaultTableModel dtm;
	public Main_Table() throws HeadlessException {
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//this.setLayout(null);
		this.setSize(200,200);
		
		dtm = new DefaultTableModel(1,3){

			@Override
			public String getColumnName(int column) {
				switch(column){
				case 0: return "Spalte1";
				case 1: return "Spalte2";
				case 2: return "Spalte3";
				}
				
				
				return super.getColumnName(column);
			}
			
		};
		table = new JTable(dtm);
		table.addKeyListener(new MyKeyListener());
				
		sp_table = new JScrollPane(table);
		
		this.add(sp_table);
		
		this.pack();
	}



	public static void main(String[] args) {
		Main_Table mt = new Main_Table();
		mt.setVisible(true);

	}
	
	public class MyKeyListener implements KeyListener{

		@Override
		public void keyPressed(KeyEvent e) {
			
			if(e.getKeyCode()== KeyEvent.VK_TAB){
				if((table.getSelectedColumn()==(table.getColumnCount()-1))&&(table.getSelectedRow()==(table.getRowCount()-1))){
					String[]data = {"","",""};
					dtm.addRow(data);
				}
			}
			
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	}

}
```

Es funktioniert mit vorheriger Eingabe als auch ohne..

Nachtrag:
Musste Feststellen das wenn eine Änderung in der letzten Zelle mit Enter abgeschlossen wird, er wieder in die 1. Zelle springt..
Wenn kein Abschluss mit Enter dann funkt. es so!!
Also muss man auch Enter-Event abfangen..
ich suche mal weiter für dich!!


----------



## Enigma228 (6. Jan 2010)

Guck mal da, da wird die Inputmap der Tabelle umgeschrieben..

http://www.java-forum.org/awt-swing-swt/27003-swing-eingabefelder-tabelle.html


----------



## Enton (7. Jan 2010)

Hi,
vielen Dank für deine Bemühungen, hat mir echt geholfen. Ich werde die Eingabetaste einfach auch noch mit abfangen. Die Inputmap der Tabelle umschreiben erscheint mir etwas übertrieben.
Danke


----------

