# Swing: Eingabefelder in Tabelle



## MichiM (12. Mrz 2006)

Hi,

verwende in meinem Swing-Frontend eine zweispaltige Tabelle, abgeleitet von der Klasse AbstractTableModel.

Nun möchte ich in jeder Zeile jeweils links eine Beschreibung zum Feld haben und rechts ein Eingabefeld.
Wie baut man am besten so eine Eingabe ein? Mit JTextField() krieg ich es nicht hin. Da krieg ich in die Zellen rein dann jeweils eine Fehlermeldung "javax.swing.JTextField[,0,0,0x0,invalid,layout=javax. ..."

Der momentane Codeausschnitt:



```
TableModel dataModel = new AbstractTableModel()
	    {
	        
	    		public String getColumnName( int column )
	    		{
	    			String ColumnName = "";
	    			
	    			switch ( column )
	    			{
	    				case 0: ColumnName = "Feld"; break;
	    				
	    				case 1: ColumnName = "Inhalt"; break;
	    			}
	    			
	    			return ColumnName;
	    		}
		    	
	    		public int getColumnCount()
		        {
		        	return 2;
		        }
		        
		        public int getRowCount()
		        {
		        	return aList.size();
		        }
		        
		        public Object getValueAt ( int row, int col )
		        {
		        	if ( col == 0 )
		        		
		        		return new String ( aList.get( row ).toString() );
		        	
		        	else
		        		
		        		return new JTextField ( "Bitte Text eingeben: " );
	       	
		        }
	    };
    
    JTable table = new JTable ( dataModel );
    JScrollPane scrollpane2 = new JScrollPane ( table );
    panel2.add ( scrollpane2 );
```

Wie kriegt man also so eine Eingabezeile in eine Tabellenzelle?

Gruß Michi


----------



## André Uhres (12. Mrz 2006)

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TabellenNavigation extends JFrame {
    public TabellenNavigation() {
        setTitle("Drücke Enter zum Navigieren");
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize(400,300);
        setLocationRelativeTo( null );
        tabelle = new JTable(15, 2) {
            public boolean isCellEditable(int zeile, int spalte) {
                return spalte % 2 != 0;//jede zweite Zelle ist editierbar
            }
        };
        String[] namen = new String[]{"a", "b","c","d","e","f","g","h","i","j",
        "k","l","m","n","o",};
        for (int i = 0; i < tabelle.getRowCount(); i++) {
            tabelle.setValueAt(namen[i],i,0);
        }
        getContentPane().add( new JScrollPane( tabelle ) );
        InputMap im = tabelle.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        //  "Enter"-Taste bekommt die Funktion der "Tab"-Taste
        KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
        KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
        Object tabFunktion = im.get(tab);
        im.put(enter, tabFunktion);
        //  Die Taste "Rechter-Pfeil" ausblenden
        KeyStroke rechts = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
        im.put(rechts, "none");
        //  Die Taste "Linker-Pfeil" ausblenden
        KeyStroke links = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
        im.put(links, "none");
        //  Das übliche "Tab" Verhalten überschreiben:
        //  Auf die nächste editierbare Zelle springen;
        //  wenn keine editierbare Zellen vorhanden, auf nächste Zelle gehen.
        final Action alteTabAktion = tabelle.getActionMap().get(tabFunktion);
        Action tabAktion = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                alteTabAktion.actionPerformed( e );
                JTable tabelle = (JTable)e.getSource();
                int zeilenAnzahl = tabelle.getRowCount();
                int spaltenAnzahl = tabelle.getColumnCount();
                int zeile = tabelle.getSelectedRow();
                int spalte = tabelle.getSelectedColumn();
                while (! tabelle.isCellEditable(zeile, spalte) ) {
                    spalte++;
                    if (spalte == spaltenAnzahl) {
                        spalte = 0;
                        zeile++;
                    }
                    if (zeile == zeilenAnzahl) {
                        zeile = 0;
                    }
                    //  Zurück zum Startpunkt, rausgehen.
                    //  (für den Fall wo keine Zelle editierbar ist)
                    if (zeile == tabelle.getSelectedRow()
                    &&  spalte == tabelle.getSelectedColumn()) {
                        break;
                    }
                }
                tabelle.changeSelection(zeile, spalte, false, false);
            }
        };
        tabelle.getActionMap().put(tabFunktion, tabAktion);
        tabelle.addKeyListener(new KeyAdapter(){
            public void keyReleased(KeyEvent e){
                enterKeyReleased(e);
            }
        });
        tabelle.changeSelection(0,1,false,false);
    }
    private void enterKeyReleased(KeyEvent e){
        if(tabelle.getCellEditor()!=null){
            tabelle.getEditorComponent().requestFocusInWindow();
        }
    }
    private JTable tabelle;
    public static void main(String[] args) { new TabellenNavigation().setVisible(true);}
}
```


----------



## MichiM (14. Mrz 2006)

Gutes Beispiel, danke.


----------



## dominik___ (20. Apr 2006)

vielen Dank für das SEHR GUTE Beispiel!


----------



## Scruffy (1. Jul 2008)

Kann man dieses Verhalten noch auf die Spitze treiben, daß nach dem Drücken von Enter (noch im Editmodus der Zelle) die nächste Zelle in den Editmodus versetzt wird? Also, daß man nachdem man die Zelle gefüllt hat nicht zweimal Enter drücken muß um weiter zu gelangen.


----------



## André Uhres (8. Jul 2008)

Scruffy hat gesagt.:
			
		

> daß nach dem Drücken von Enter (noch im Editmodus der Zelle) die nächste Zelle in den Editmodus versetzt wird?


http://www.java-forum.org/de/viewtopic.php?p=195661#195661


----------

