# Focus in JTable Cell



## amandina (19. Jan 2010)

Hallo,

Ich habe ein JTable wo der Benutzer normalerweise nur in eine Spalte editieren kann. Wenn die Eingabelänge=9, dann wird die Information bearbeitet und in die Zeile gespeichert und gleichzeitig eine neue Zeile erstellt, wo der Focus sich immer noch in der erste Spalte befindet. Wenn die Eingabe falsch ist, sollte eine Fehlermeldung für den Benutzer geben, Eingabe gelöscht und der Focus immer in derselbe Zelle bleiben. Bei mir aber springt der Focus in der nächste Zelle. Wieso??

[Java]

import java.awt.*;

import java.util.Vector;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

public class Test implements TableModelListener{
    DefaultTableModel model;
    JTable table;
    final int LIMIT=9;


   public Test(){
         createTable();

         JPanel leftPanel = new JPanel(new BorderLayout(6, 6));
         leftPanel.add(new JScrollPane(table), BorderLayout.CENTER);
         JPanel centerPanel = new JPanel(new GridLayout(1, 2, 6, 6));
         centerPanel.add(leftPanel);
         JPanel contentPane = new JPanel(new BorderLayout(6, 6));
         contentPane.add(centerPanel, BorderLayout.CENTER);
         JFrame f = new JFrame("Test Frame");
         f.setContentPane(contentPane);
         f.pack();
         f.setLocationRelativeTo(null);
         f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         f.setVisible(true);

    }

    public static void main(String[] args) {
        new Test();

  }

  private void createTable() {
        table=new JTable();
        model = new DefaultTableModel() {
                @Override

                public boolean isCellEditable(int row, int col) {

                   if(col==1 ){
                        return true;
                   }else{
                        return false;
                   }

                }


          };
         model.addColumn("A");
         model.addColumn("B");
         model.addColumn("C");
         model.addColumn("D");
         model.addColumn("E");
         model.addColumn("F");
         model.addTableModelListener(this);
         table.setModel(model);
         table.setCellSelectionEnabled(true);
         table.setColumnSelectionAllowed(true);
         table.setRowSelectionAllowed(true);
         addEmptyRow() ;

  }

    @Override
    public void tableChanged(TableModelEvent e) {
       if(e.getColumn()==1 && model.getRowCount()>0){
           String line=(String)model.getValueAt(model.getRowCount()-1,1);

           if(line.length()==LIMIT){

                    addDataToLastRow(line);
           }
           if(!line.isEmpty() && line.length()!=LIMIT){
                JOptionPane.showMessageDialog(null, "Eingabe hat ein nicht erkennbaren Format,wird geloescht");
                if (table.getCellEditor() != null) {
                        table.getCellEditor().cancelCellEditing();
                }

            loescheLastRow();
           }

       }

    }

    private void addDataToLastRow(String info)  {

       int lastRow =model.getRowCount()-1;
       model.setValueAt(info, lastRow, 2);
       model.setValueAt(info, lastRow, 3);
       model.setValueAt(info, lastRow, 4);
       model.setValueAt(info, lastRow, 5);
       addEmptyRow();

    }

    private void loescheLastRow() {
            model.removeRow(model.getRowCount() - 1);
            addEmptyRow();


    }



    private void addEmptyRow() {

       Vector temp=new Vector();
       temp.add(model.getRowCount()+1);
       temp.add("");
       temp.add("");
       temp.add("");
       temp.add("");
       temp.add("" );
       model.addRow(temp); 

       focusEmptyRow();



    }
    void focusEmptyRow(){

       int row = model.getRowCount()-1;
       //System.out.println("row:"+row);
       int col = 1;
        // Set the cell in edit mode

        boolean success = table.editCellAt(row, col);
        //System.out.println("success:"+success);
        if (success) {
            // Select cell
            boolean toggle = false;
            boolean extend = false;
            table.changeSelection(row, col, toggle, extend);
            table.requestFocus();
        }
    }

}



[/Java]


----------



## nickname (19. Jan 2010)

hi,

versuch mal den focus, in 
	
	
	
	





```
JOptionPane.showMessageDialog(null, "Eingabe hat ein nicht erkennbaren Format,wird geloescht");
```
einzubringen.

Schreib eine eigene Methode dafür, z.B
	
	
	
	





```
public void getInformationMessage(String information)
{
JOptionPane.showMessageDialog(null, information);
table.requestFocus();
}
```

gruß nickname


----------



## amandina (19. Jan 2010)

Hi,

Das Problem ist, dass die Tabelleden Focus hat, aber nicht in der gewünschten Zelle. Anyway, vielen Dank für deine Antwort, auch wenn keine Lösung ist.


----------



## amandina (20. Jan 2010)

Ich habe die Lösung gefunden, nach JTable Initialisierung muss man 

[Java]
 table.setSurrendersFocusOnKeystroke(true);
[/Java]

und auch

[Java]
 @Override
    public void tableChanged(TableModelEvent e) {
       if(e.getColumn()==1 && model.getRowCount()>0){
           String line=(String)model.getValueAt(model.getRowCount()-1,1);

           if(line.length()==LIMIT){

                    addDataToLastRow(line);
           }
           if(!line.isEmpty() && line.length()!=LIMIT){
                JOptionPane.showMessageDialog(null, "Eingabe hat ein nicht erkennbaren Format,wird geloescht");
                if (table.getCellEditor() != null) {
                        table.getCellEditor().cancelCellEditing();
                }

                loescheLastRow();
                table.setColumnSelectionInterval(1, 1);
                table.setRowSelectionInterval(e.getFirstRow(),e.getFirstRow() );

           }

       }

    } 

[/Java]


----------

