# JTabel Methode addRow und deleteRow



## Lender (1. Feb 2010)

Hallo zusammen,

ich verzweifel langsam. Könnte sich vllt einer den Code anschauen und mir erklären wo der Fehler liegt?

```
public class VerantwortlicherTableModel extends AbstractTableModel {
    Object[][] objects = new Object[1][3];

    private Object[][] data = new Object[][]{
        {"TEST1", "0", "50"},
        {"TEST2", "1", "60"},
        {"TEST3", "1", "110"},
        {null, null, null}
    };

    public void addRow(int position) {
        Object[][] newObjects = new Object[data.length + 1][getColumnCount()];
        System.arraycopy(data, 0, newObjects, 0, data.length );
        data = newObjects;
        fireTableRowsInserted(2, 2);
    }
```


```
public class VerantwortlicherTable extends JTable {
    VerantwortlicherTableModel model = new VerantwortlicherTableModel();

    public VerantwortlicherTable(){
        getCellRenderer(0,1);
        getCellRenderer(0,2);
        setModel(model);
    }

    public TableCellRenderer getCellRenderer(int row, int column) {
        if(column==1||column==2){
            return new RightAlignRenderer();
            }

        return super.getCellRenderer(row, column);
    }
    public void deleteRow(int position){
    	model.deleteRow(position);
    }
    public void addRow(int i){
        model.addRow(i);
    }
}
```

also was ich genau versuche ist das ich eine eigene Klasse von JTable hab und eine eigene Klasse von AbstractTableModel.
Jetzt wollt ich das wenn man auf einem Button drückt die Methode addRow() ausgeführt wird. Leider klappt dies nicht bei mir

Ich bezweifel sehr das meien addRow() Methode richtig ist. Er sagt keinen Fehler, nix, wenn ich auf den Button in meinem JPanel das mein eigenes JTable beinhaltet. 

Die Methode addRow soll eine Zeile über die makierte Zeile einfügen. 

Wäre euch sehr verbunden wenn ihr mir kurz helft 

grüße lender


----------



## lender (1. Feb 2010)

Fehler: Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid range


----------



## Michael... (1. Feb 2010)

Die Fehlermeldung sagt Dir normalerweise auch in welcher Zeile der Fehler auftritt.

In dem Zusammenhang wäre Dein komplettes TableModel interessant vor allem die Methoden die auf das Datenarray zugreifen, wie z.B. getValueAt, getRowCount...


----------



## lender (1. Feb 2010)

```
package de.walbusch.wis.client.modul.verantwortlicher;

import javax.swing.table.AbstractTableModel;

/**
 *
 * @author AKruse
 */

public class VerantwortlicherTableModel extends AbstractTableModel {
    Object[][] objects = new Object[1][3];

    private Object[][] data = new Object[][]{
        {"test1", "0", "50"},
        {"test2", "1", "60"},
        {"test3", "1", "110"},
        {null, null, null}
    };

    public String getColumnName(int pos) {
        String[] cols = new String[]{
            "Name", "Aktiv", "Sotierung"
        };
        return cols[pos];
    }

    public Object getValueAt(int row, int column) {
        return data[row][column];
    }

    public int getRowCount() {
        return 3;  //Die 3 Ist nur zu Testzwecken
    }

    public int getColumnCount() {
        return 3;
    }

    public void addRow(int position) {
        Object[][] newObjects = new Object[data.length + 1][getColumnCount()];
        System.arraycopy(data, 0, newObjects, 0, data.length );
        data = newObjects;
        fireTableRowsInserted(0, data.length);
    }
    
    public void deleteRow(int position){
    	//verantwortlicherTable.deleteRow(1,1);  	
    }

    	public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }

       }
```


----------



## Michael... (1. Feb 2010)

Ich vermute mal, dass das TableModel zwar die Ursache des Problems ist, der Fehler aber an anderer Stelle eintritt.
Ändere mal Deine getRowCount

```
public int getRowCount() {
        return data.length;
}
```

Ansonsten: Erstelle das Array *cols* nur eimal - so wie Du es bei *data* machst


----------



## lender (3. Feb 2010)

ich komm nicht weiter selbes Problem anbei findet ihr alle Klassen.


```
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author AKruse
 */
public class VerantwortlicherTableModel extends AbstractTableModel {
    Object[][] objects = new Object[1][3];

    private Object[][] data = new Object[][]{
        {"test", "0", "50"},
        {"test", "1", "60"},
        {"test", "1", "110"},
        {null, null, null}
    };

    public String getColumnName(int pos) {
        String[] cols = new String[]{
            "Name", "Aktiv", "Sotierung"
        };
        return cols[pos];
    }

    public Object getValueAt(int row, int column) {
        return data[row][column];
    }

    public int getRowCount() {
    	return data.length;
    }

    public int getColumnCount() {
        return 3;
    }
    
    private boolean editable = true;
    public boolean isEditable() {
		return editable;
	}
	public void setEditable(boolean editable) {
		this.editable = editable;
	}

    public void addRow(int position) {
        Object[][] newObjects = new Object[data.length + 1][getColumnCount()];
        System.arraycopy(data, 0, newObjects, 0, data.length );
        data = newObjects;
        fireTableRowsInserted(0, data.length);
    }
    
    public void deleteRow(int position){
    		
    }

    	public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }

       }
```


```
import java.util.List;

import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import de.walbusch.wis.client.business.stammdaten.StammdatenDelegate;
import de.walbusch.wis.client.frame.AbstractModul;
import de.walbusch.wis.server.ejb.entity.VerantwortlicherEntity;
/**
 *
 * 
 */
public class VerantwortlicherModul extends AbstractModul {

    /** Creates new form TestPanel */
    public VerantwortlicherModul() {
        initComponents();
        init();
        setName("Verantwortlicher");
    }

    void init(){  
       verantwortlicherTable.setAutoCreateRowSorter(true);
       int anzahlSpalten = verantwortlicherTable.getRowCount()-1;
       jLabel2.setText((new Integer(anzahlSpalten)).toString());
       verantwortlicherTable.getModel().addTableModelListener(new TableModelListener() {

            public void tableChanged(TableModelEvent e) {
                jtabletablechanged(e);
            }
        });
      
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        verantwortlicherTable = new VerantwortlicherTable();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jComboBox1 = new javax.swing.JComboBox();
        _tfxMandant = new javax.swing.JLabel();

        setLayout(new java.awt.GridBagLayout());

        jLabel1.setText("Anzahl Datensätze: ");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 7;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0);
        add(jLabel1, gridBagConstraints);

        jLabel2.setText("0");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 7;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 4, 0);
        add(jLabel2, gridBagConstraints);

        jScrollPane2.setViewportView(verantwortlicherTable);

        jButton1.setText("Einfügen");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Löschen");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 639, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 92, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 362, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton2)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.gridwidth = 22;
        gridBagConstraints.gridheight = 6;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 500.0;
        gridBagConstraints.weighty = 500.0;
        add(jPanel1, gridBagConstraints);

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Walbusch" }));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 0);
        add(jComboBox1, gridBagConstraints);

        _tfxMandant.setText("Mandant");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(7, 11, 8, 10);
        add(_tfxMandant, gridBagConstraints);
    }// </editor-fold>                        

    private void jtabletablechanged(TableModelEvent e){
    
    }
    	
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    	
    	}                                        

    	private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    		
    	}                                        
    	
    	private void zaehlerhochsetzen(){
    		jLabel2.setText((new Integer(verantwortlicherTable.getRowCount()-1)).toString());
    	}
    	
    // Variables declaration - do not modify                     
    private javax.swing.JLabel _tfxMandant;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private VerantwortlicherTable verantwortlicherTable;

    // End of variables declaration                   



// *******************************************************************
// Implementiert Modul
// *******************************************************************
public void open() {
	
	
}
public void aktualisieren() {
	
}

public void speichern() {
	
}

public void deactivate() {
	super.deactivate();
	
}

public void setModus() { 

}
}
```



```
package de.walbusch.wis.client.modul.verantwortlicher;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class VerantwortlicherTable extends JTable {
    VerantwortlicherTableModel model = new VerantwortlicherTableModel();

    public VerantwortlicherTable(){
        getCellRenderer(0,1);
        getCellRenderer(0,2);
        setModel(model);
    }

    public TableCellRenderer getCellRenderer(int row, int column) {
        if(column==1||column==2){
            return new RightAlignRenderer();
            }

        return super.getCellRenderer(row, column);
    }
    public void deleteRow(int position){
    	model.deleteRow(position);
    }
    public void addRow(int i){
        model.addRow(i);
    }
}
```



```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.Component;

import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

    public class RightAlignRenderer implements TableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column) {

            if (column==1){
                JCheckBox checkbox = new JCheckBox();
                checkbox.setHorizontalAlignment(JCheckBox.RIGHT);
                return checkbox;
                }
            else if (column==2){
                JLabel label = new JLabel("1");
                label.setHorizontalAlignment(JLabel.RIGHT);
                return label;
                }
            return table;

        }

    }
```


----------



## Michael... (3. Feb 2010)

Hab im Code nirgends einen Aufruf der Methode addRow(...) gefunden.


----------



## lender (3. Feb 2010)

danke stimmt 

aber jetzt kommt dieser Fehler aber ich kann an der Methode nix falsches sehen


Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid range
	at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
	at javax.swing.JTable.notifySorter(Unknown Source)
	at javax.swing.JTable.sortedTableChanged(Unknown Source)
	at javax.swing.JTable.tableChanged(Unknown Source)
	at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
	at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
	at de.walbusch.wis.client.modul.verantwortlicher.VerantwortlicherTableModel.addRow(VerantwortlicherTableModel.java:56)
	at de.walbusch.wis.client.modul.verantwortlicher.VerantwortlicherTable.addRow(VerantwortlicherTable.java:27)
	at de.walbusch.wis.client.modul.verantwortlicher.VerantwortlicherModul.jButton1ActionPerformed(VerantwortlicherModul.java:149)
	at de.walbusch.wis.client.modul.verantwortlicher.VerantwortlicherModul.access$1(VerantwortlicherModul.java:148)
	at de.walbusch.wis.client.modul.verantwortlicher.VerantwortlicherModul$2.actionPerformed(VerantwortlicherModul.java:81)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)


----------



## Ebenius (3. Feb 2010)

In Deinem TableModel sieht's aber seltsam aus. Ich habe mir den Rest gar nicht angesehen, aber die [c]addRow[/c]-Methode stimmt vorn und hinten nicht. [c]position[/c] wird nicht benutzt. Das neue Array wird unsinnig erzeugt. Und der Event wird völlig falsch versendet. Natürlich zickt Dich dann der RowSorter an.

[java=45]    public void addRow(int position) {
        // make sure index is in bounds
        position = Math.max(0, Math.min(data.length, position));

        // allocate two-dim array
        Object[][] newObjects = new Object[data.length + 1][];

        // copy array in two parts to make room for the new entry
        System.arraycopy(data, 0, newObjects, 0, position);
        System.arraycopy(data, position, newObjects, position + 1,
            data.length - position);

        // allocate the new row now
        newObjects[position] = new Object[getColumnCount()];
        data = newObjects;

        // fire the correct insertion event; one row inserted!
        fireTableRowsInserted(position, position);
    }
[/code]
Den Code hab ich im Browser getippt und nicht getestet. Hoffentlich stimmts. ;-)

Ebenius


----------



## Michael... (3. Feb 2010)

lender hat gesagt.:


> (VerantwortlicherTableModel.java:56)


Was steht denn im Originalcode in dieser Zeile

Ansonsten ist es schwer sich durch Deinen Code durchzuarbeiten, versuche mal den Code auf das wesentliche zur reduzieren und dann Stück für Stück auf zu bauen bis der Fehler auftritt.

So wie es aussieht hat der RowSorter ein Problem mit dem Einfügen, eventuell mag er den Bereich den Du einfügst nicht 0 bis data.length, da Du ja eigentlich nur eine Reihe einfügst.
Kann das allerdings nicht ausprobieren, da ich beim mir java 1.5 verwende


----------



## Ebenius (3. Feb 2010)

Michael... hat gesagt.:


> Was steht denn im Originalcode in dieser Zeile[...]


Da steht wahrscheinlich Zeile 49 von hier. 

Siehe mein Beitrag vorher.

Ebenius


----------



## lender (3. Feb 2010)

fireTableRowsInserted(0, data.length);


----------



## Ebenius (3. Feb 2010)

Und meinen Beitrag von 11:54 hast Du überlesen, oder?

Ebenius


----------

