# JTable setSelectionInterval



## julchen81 (25. Mrz 2008)

Hallo,

ich habe ein JTable implementiert. In dieser Tabelle kann eine Zeile markiert werden. Wird nun strg+l gedrückt, wird oberhalb der Markierung eine neue Zeile eingefügt.
Jetzt wäre es natürlich praktisch, dass dann sofort wieder diese Zeile markiert ist. Das habe ich mit setSelectionIntervall(i, i) gemacht.
Drücke ich allerdings jetzt noch mal die Tastenkombination strg+l wird keine neue Zeile mehr eingefügt. Das geschieht erst dann, wenn ich extra noch mal in diese Zeile klicke.
Wieso muss ich noch mal extra klicken, wenn doch die Zeile bereits markiert ist?!


```
public void keyPressed(KeyEvent e) {
		int row = gui.table.getSelectedRow();


			if ((e.isControlDown()) && (e.getKeyCode() == KeyEvent.VK_L)) {
				for (int i = 99; i > row; i--) {
					for (int j = 0; j < 4; j++) {
						gui.al.dataMiddle[i][j] = gui.al.dataMiddle[i-1][j];
					}
				}
				gui.al.dataMiddle[row][0] = null;
				gui.al.dataMiddle[row][1] = null;
				gui.al.dataMiddle[row][2] = null;
				gui.al.dataMiddle[row][3] = null;
				
				gui.table = new JTable(gui.al.dataMiddle, gui.columnNames);
				gui.table.setColumnModel(gui.colModel);
				gui.table.addKeyListener(new AddLine(gui));
				gui.table.addKeyListener(new DeleteLine(gui));
				gui.table.getSelectionModel().setSelectionInterval(row, row);
				gui.sp.getViewport().add(gui.table);
			}
.........
```

Hätte schon ein bisschen rumgespielt und z.B. folgendes abgeändert:

```
gui.table.getSelectionModel().setSelectionInterval(row+1, row+1);
System.out.println(gui.table.getSelectedRow());
```

hier wird dann auch die darunterliegende Zeile markiert und der print-Befehl gibt auch diese Zeile aus. Also das würde eigentlich passen...

Jemand einen Tipp?   :bahnhof: 

Julia


----------



## André Uhres (26. Mrz 2008)

```
Action a = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        int row = table.getSelectedRow();
        if (row >= 0) {
            DefaultTableModel model = (DefaultTableModel) table.getModel();
            model.insertRow(row, new Object[]{"ok", null, null, null});
            table.changeSelection(row, 0, false, false);
        }
    }
};
InputMap inputMap = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.CTRL_MASK), "insertRow");
table.getActionMap().put("insertRow", a);
```


----------



## julchen81 (27. Mrz 2008)

Guten Morgen!!

Hatte schon nicht mehr an eine Antwort geglaubt ;-) Danke dir!

Allerdings will's bei mir nicht. Mir schmeißt es an dieser Stelle

```
DefaultTableModel model = (DefaultTableModel) gui.table.getModel();
```

eine Exception:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTable$1 cannot be cast to javax.swing.table.DefaultTableModel

hmmmm......????

LG Julia


----------



## MiDniGG (27. Mrz 2008)

Sei mal nicht so ungeduldig... ^^ Grad mal ein Tag... ;-)

Zu deinem Problem: Da kannst wohl nicht ein JTable in ein DefaultTableModel casten...


----------



## MiDniGG (27. Mrz 2008)

Aber ich würde es so lösen:


```
DefaultTableModel dtm = null;
	
JTable tbTable = null

...

String[] title = new String[]
		{
			"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"
		};

dtm = new DefaultTableModel(title, 0);
		
tbTable = new JTable(dtm);
```

Sorry für den Doppelpost...


----------



## julchen81 (27. Mrz 2008)

Das hab ich jetzt so gemacht, und es klappt auch - ABER:
Ich kann nach wie vor nicht 2x hintereinander eine neue Zeile einfügen, das klappt erst wieder wenn ich erneut in die Tabelle klicke UND
ich erhalte nicht nur EINE neue Zeile, sondern 2, weil nämlich auch die markierte Zeile erneut eingefügt wird.


```
DefaultTableModel model = new DefaultTableModel(gui.al.dataMiddle, gui.columnNames);
model.insertRow(row, new Object[] {null, null, null, null});
gui.table = new JTable(model);
gui.table.changeSelection(row, 0, false, false);
gui.table.setColumnModel(gui.colModel);
gui.table.addKeyListener(new AddLine(gui));
gui.table.addKeyListener(new DeleteLine(gui));
gui.sp.getViewport().add(gui.table);
```

Julia   ???:L


----------



## julchen81 (27. Mrz 2008)

Ich glaube mittlerweile nicht mehr, dass mein Problem mit einer falschen Markierung zusammenhängt - meine Tabelle reagiert nämlich auf überhaupt kein key-Event mehr, bis ich erneute in die Tabelle klicke.

Ich formuliere die Frage neu und stell sie noch mal in's Forum, vielleicht kann mir ja jemand helfen.

LG Julia


----------



## André Uhres (27. Mrz 2008)

Wozu eine neues Thema erstellen? Die Antwort steht doch schon oben. 
Hier ist sie nochmal zusammengefasst:

```
package demo;
/*
 * TestCtrl_L.java
 */

import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TestCtrl_L extends JFrame {

    private DefaultTableModel dtm;
    private JTable table;

    public TestCtrl_L() {
        super("Press Ctrl+L");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        String[] title = new String[]{
            "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"
        };
        dtm = new DefaultTableModel(title, 0);
        table = new JTable(dtm);
        Action a = new AbstractAction() {

            public void actionPerformed(ActionEvent e) {
                int row = table.getSelectedRow();
                if (row >= 0) {
                    DefaultTableModel model = (DefaultTableModel) table.getModel();
                    model.insertRow(row, new Object[]{"ok", null, null, null});
                    table.changeSelection(row, 0, false, false);
                }
            }
        };
        InputMap inputMap = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.CTRL_MASK), "insertRow");
        table.getActionMap().put("insertRow", a);
        add(new JScrollPane(table));
        dtm.addRow(new Object[]{null, null, null, null});
        table.changeSelection(0, 0, false, false);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new TestCtrl_L().setVisible(true);
            }
        });

    }
}
```


----------

