Hallo,
ich habe ein TableModel, welches ich mit Objekten vom Typ Person fülle. Jetzt möchte ich einzelnen Personen (also Zeilen) aus dem TableModel entfernen. In der Tabelle wird der Eintrag, den ich selektiere, auch entfernt. Allerdings wird auch immer eine Excpetion geworfen, welche ich mir nicht erklären kann und daher auf eurer Expertise vertraue.
Das TableModel habe ich wie folgt implementiert:
Klasse Person:
Mein Abschnitt zum Löschen der einzelnen Zeile sieht wie folgt aus:
Wie oben bereits erwähnt, wird die betreffende Zeile gelöscht, aber auch immer folgende Exception geworfen:
Was mache ich falsch? Und wie kann ich abfragen, ob ich bereits die letzte Zeile gelöscht habe? Ich danke euch für die Hilfe!
ich habe ein TableModel, welches ich mit Objekten vom Typ Person fülle. Jetzt möchte ich einzelnen Personen (also Zeilen) aus dem TableModel entfernen. In der Tabelle wird der Eintrag, den ich selektiere, auch entfernt. Allerdings wird auch immer eine Excpetion geworfen, welche ich mir nicht erklären kann und daher auf eurer Expertise vertraue.
Das TableModel habe ich wie folgt implementiert:
Java:
package app.table;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import app.model.Person;
public class PersonOverviewTableModel implements TableModel {
private List<Person> persons = new ArrayList<>();
private List<TableModelListener> listeners = new ArrayList<>();
public void addPerson(Person p) {
int index = persons.size();
persons.add(p);
TableModelEvent event = new TableModelEvent(this, index, index, TableModelEvent.ALL_COLUMNS,
TableModelEvent.INSERT);
for (TableModelListener listener : listeners)
listener.tableChanged(event);
}
public void removePerson(int index) {
persons.remove(index);
TableModelEvent event = new TableModelEvent(this);
// TableModelEvent event = new TableModelEvent(this, index, index,
// TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
for (TableModelListener listener : listeners)
listener.tableChanged(event);
}
public Person getPerson(int index) { return persons.get(index); }
@Override
public int getRowCount() { return persons.size(); }
@Override
public int getColumnCount() { return 3; }
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0: return "ID";
case 1: return "Vorname";
case 2: return "Nachname";
default: return null;
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0: return Long.class;
case 1: case 2: return String.class;
default: return null;
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) { return false; }
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Person p = persons.get(rowIndex);
switch (columnIndex) {
case 0: return p.getId();
case 1: return p.getFirstName();
case 2: return p.getLastName();
default: return null;
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) { }
@Override
public void addTableModelListener(TableModelListener l) { listeners.add(l); }
@Override
public void removeTableModelListener(TableModelListener l) { listeners.remove(l); }
}
Klasse Person:
Java:
package app.model;
import java.time.LocalDate;
public class Person {
private int id;
private String firstName;
private String lastName;
private LocalDate birthday;
public Person() {
}
public Person(int id, String firstName, String lastName, LocalDate birthday) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.birthday = birthday;
}
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public LocalDate getBirthday() { return birthday; }
public void setBirthday(LocalDate birthday) { this.birthday = birthday; }
}
Mein Abschnitt zum Löschen der einzelnen Zeile sieht wie folgt aus:
Java:
deleteButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int index = table.getSelectedRow();
System.out.println(index);
model.removePerson(index);
}
});
Wie oben bereits erwähnt, wird die betreffende Zeile gelöscht, aber auch immer folgende Exception geworfen:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:424)
at java.util.ArrayList.get(ArrayList.java:437)
at app.table.PersonOverviewTableModel.getPerson(PersonOverviewTableModel.java:37)
at app.view.PersonOverviewPanel$1.valueChanged(PersonOverviewPanel.java:91)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211)
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:405)
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:415)
at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(DefaultListSelectionModel.java:576)
at javax.swing.DefaultListSelectionModel.clearSelection(DefaultListSelectionModel.java:420)
at javax.swing.JTable.clearSelection(JTable.java:2120)
at javax.swing.JTable.clearSelectionAndLeadAnchor(JTable.java:2128)
at javax.swing.JTable.sortedTableChanged(JTable.java:4153)
at javax.swing.JTable.tableChanged(JTable.java:4401)
at org.jdesktop.swingx.JXTable.tableChanged(JXTable.java:1561)
at app.table.PersonOverviewTableModel.removePerson(PersonOverviewTableModel.java:33)
at app.view.PersonOverviewPanel$4.actionPerformed(PersonOverviewPanel.java:168)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:262)
at java.awt.Component.processMouseEvent(Component.java:6539)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3318)
at java.awt.Component.processEvent(Component.java:6304)
at java.awt.Container.processEvent(Container.java:2239)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2297)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
at java.awt.Container.dispatchEventImpl(Container.java:2283)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
at java.awt.EventQueue$4.run(EventQueue.java:733)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Was mache ich falsch? Und wie kann ich abfragen, ob ich bereits die letzte Zeile gelöscht habe? Ich danke euch für die Hilfe!