# JTable selectedRow



## gastAufHilfeSuche (27. Aug 2006)

Hallo,

Ich habe hier eine JTabel erzeugt, die Rows sind nicht editierbar.
wenn ich die rows selectiere reagiert der JTabelModelListener nicht ausser wenn ich die Rows editierbar mache.

Die Frage ist:

wie kann ich eine JTable mit nicht editierbaren Zellen und trotzdem auf dem Listener reagiert.

danke


----------



## André Uhres (27. Aug 2006)

Ein TableModelListener macht ja auch was anderes als ein ListSelectionListener:

```
/*
 * TableListenerDemo.java
 */
package table;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableListenerDemo extends JFrame {
    public TableListenerDemo() {
        super("TableListenerDemo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        table = new JTable();
        toolbar = new JToolBar();
        btTest = new JButton("Test TableModelListener");
        model =  new DefaultTableModel(
                new Object [][] {
                    {"1", "a", null, new Integer(12)},
                    {"2", "b", new Boolean(true), new Integer(36)},
                    {"3", "c", new Boolean(true), new Integer(433)},
                    {"4", "d", null, new Integer(8)}
        },
                new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
        ) {
            Class[] types = new Class [] {
                String.class, String.class, Boolean.class, Integer.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        };
        table.setModel(model);
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        toolbar.add(btTest);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        
        //Listeners:
        model.addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
                myTableChanged(e);
            }
        });
        //          HIER IST DER ListSelectionListener:
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                tableValueChanged(e);
            }
        });
        btTest.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                btTestActionPerformed(evt);
            }
        });
    }
    //Diese Methode reagiert nur wenn sich das TableModel verändert:
    private void myTableChanged(TableModelEvent e){
        String type = types.get(e.getType());
        int row = e.getFirstRow()+1;
        JOptionPane.showMessageDialog(null, "TableModelListener is OK:\n"
                +type+" row "+row);
    }
    
    //Diese Methode reagiert auf Änderungen in der Zeilenauswahl:
    private void tableValueChanged(ListSelectionEvent e){
        if(e.getValueIsAdjusting()) return;
        int row = table.getSelectedRow()+1;
        System.out.println("Selected row: "+row);
    }
    
    //Nur zum Testen des TableModelListeners:
    private void btTestActionPerformed(ActionEvent evt) {
        Object[] rowData = new Object[]{"5", "e", new Boolean(true), new Integer(12)};
        model.addRow(rowData);
        btTest.setEnabled(false);
    }
    public static void main(String args[]) {new TableListenerDemo().setVisible(true);}
    private DefaultTableModel model;
    private Map<Integer, String> types = new HashMap<Integer, String>();{
        types.put(TableModelEvent.INSERT, "INSERT");
        types.put(TableModelEvent.DELETE, "DELETE");
        types.put(TableModelEvent.UPDATE, "UPDATE");
    }
    private JButton btTest;
    private JTable table;
    private JToolBar toolbar;
}
```


----------



## Guest (27. Aug 2006)

Vielen Dank,

sie waren eine sehr große Hilfe für mich, ich hätte aber gern noch eine Frage.

Ich habe recherchiert wie ich den LookandFeel andere aber ich war erfolglos. Ich dachte es wäre einfach mit 
setDefaultLookandfeel zu realisieren aber das habe ich nicht gefunden.

vielen Dank


----------



## André Uhres (27. Aug 2006)

UIManager.setLookAndFeel(..)


----------



## ManuP (27. Aug 2006)

@André

Was bedeutet das folgende:

```
private Map<Integer, String> types = new HashMap<Integer, String>();{
        types.put(TableModelEvent.INSERT, "INSERT");
        types.put(TableModelEvent.DELETE, "DELETE");
        types.put(TableModelEvent.UPDATE, "UPDATE");
    }
```

... und noch was: warum frisst Eclipse das bei mir nicht?

lg ManuP


----------



## André Uhres (28. Aug 2006)

ManuP hat gesagt.:
			
		

> ..Was bedeutet das folgende:
> 
> ```
> private Map<Integer, String> types = new HashMap<Integer, String>();{
> ...


Hier wird in einer Map jedem TableModelEvent (int Wert) ein String zugeordnet zwecks Ausgabe als Klartext.
Dein Eclipse *frisst *das nicht weil er möglicherweise keinen *Tiger *hat   
Java 5 (=Tiger) musst du haben, oder einfach die beiden "<Integer, String>" weglassen  :wink:
Dann musst du aber oben auch noch nach "String" casten:

```
String type = (String)types.get(e.getType());
```
Vielleicht musst du auch den int Wert noch als Integer wrappen, da bin ich grad net sicher...
Kann natürlich noch was anderes sein bei deinem Eclipse, ich kenn ja die Fehlermeldung nicht


----------



## Guest (28. Aug 2006)

hallo,

ich habe ein Tree erstellt und ich möchte den Rowindex von einem Node in diesem Tree ermitteln oder den treePath dieses Nodes. Ich habe zwar in der Api gesucht aber erfolglos.

bitte darum um Hilfe


----------



## André Uhres (29. Aug 2006)

DefaultMutableTreeNode#getPath()


----------

