Zeile entfernen TableModel

padde479

Bekanntes Mitglied
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:

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!
 
Du hast uns jetzt nicht Deine PersonOverviewPanel Klasse gezeigt. Da hast Du eine innere Klasse mit einer Implementation von valueChanged. Da musst Du vermutlich ansetzen.

Durch Deine Änderung im Model ändert sich da etwas und Du greifst dann auf einen index -1 zu. Evtl. reicht es einfach, den index zu prüfen und wenn dieser nicht >= 0 ist, dann gehst Du mit return direkt raus oder so. Aber ohne genauen Code kann ich da natürlich nur raten.
 
Besten Dank für die schnelle Antwort. Hier meine Klasse PersonOverviewPanel:
Java:
package app.view;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.JTextComponent;

import org.jdesktop.swingx.JXButton;
import org.jdesktop.swingx.JXLabel;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.JXTextField;
import org.jdesktop.swingx.JXTitledPanel;

import app.model.Person;
import app.table.PersonOverviewTableModel;
import app.util.DateUtil;
import app.util.Messages;

public class PersonOverviewPanel extends JXPanel {

    /**
     *
     */
    private static final long serialVersionUID = 2438575910574946368L;

    private PersonOverviewTableModel model = new PersonOverviewTableModel();

    private JXButton newButton;
    private JXButton editButton;
    private JXButton deleteButton;
    private JXButton saveButton;
    private JXLabel titleLabel;
    private JXLabel idLabel;
    private JXLabel firstNameLabel;
    private JXLabel lastNameLabel;
    private JXLabel birthdayLabel;
    private JXTextField idTextField;
    private JXTextField firstNameTextField;
    private JXTextField lastNameTextField;
    private JXTextField birthdayTextField;

    private List<JTextComponent> components = new ArrayList<>();
    private List<JXButton> buttons = new ArrayList<>();

    /**
     * Create the panel.
     */
    public PersonOverviewPanel() {
        setLayout(new BorderLayout(0, 0));

        JSplitPane splitPane = new JSplitPane();
        add(splitPane);

        // fill the model with dummy data
        model.addPerson(new Person(1, "Max", "Muster", LocalDate.of(1970, 1, 1)));
        model.addPerson(new Person(2, "Erika", "Mustermann", LocalDate.of(1971, 6, 30)));
        model.addPerson(new Person(3, "Maximilian", "Mustermann", LocalDate.of(1972, 12, 31)));
        JXTable table = new JXTable(model);
        table.setCellSelectionEnabled(true);
        ListSelectionModel cellSelectionModel = table.getSelectionModel();
        cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                int index = table.getSelectedRow();
                Person p = model.getPerson(index);
                idTextField.setText(Integer.toString(p.getId()));
                firstNameTextField.setText(p.getFirstName());
                lastNameTextField.setText(p.getLastName());
                birthdayTextField.setText(DateUtil.format(p.getBirthday()));
            }
        });

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(table);
        splitPane.setLeftComponent(scrollPane);

        JPanel rightHandSidePanel = new JPanel();
        splitPane.setRightComponent(rightHandSidePanel);

        idLabel = new JXLabel("ID:");
        firstNameLabel = new JXLabel("Vorname:");
        lastNameLabel = new JXLabel("Nachname");
        birthdayLabel = new JXLabel("Geburtsdatum");

        idTextField = new JXTextField();
        idTextField.setEditable(false);
        idTextField.setColumns(10);

        firstNameTextField = new JXTextField();
        firstNameTextField.setColumns(10);
        firstNameTextField.setEditable(Boolean.FALSE);

        lastNameTextField = new JXTextField();
        lastNameTextField.setColumns(10);
        lastNameTextField.setEditable(Boolean.FALSE);

        birthdayTextField = new JXTextField();
        birthdayTextField.setColumns(10);
        birthdayTextField.setEditable(Boolean.FALSE);

        newButton = new JXButton("Neu");
        newButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (JTextComponent component : components) {
                    component.setEditable(Boolean.TRUE);
                    component.setText("");
                }
                for (JXButton button : buttons) {
                    if (button.isEnabled())
                        button.setEnabled(Boolean.FALSE);
                    else
                        button.setEnabled(Boolean.TRUE);
                }
                ArrayList<Integer> list = new ArrayList<>();
                for (int i = 0; i < table.getRowCount(); i++)
                    list.add(Integer.parseInt(table.getValueAt(i, 0).toString()));
                int max = Collections.max(list);
                idTextField.setText(Integer.toString(max + 1));
            }
        });
        editButton = new JXButton("Bearbeiten");
        editButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (JTextComponent component : components) {
                    component.setEditable(Boolean.TRUE);
                }
                for (JXButton button : buttons) {
                    if (button.isEnabled())
                        button.setEnabled(Boolean.FALSE);
                    else
                        button.setEnabled(Boolean.TRUE);
                }
            }
        });
        deleteButton = new JXButton("Löschen");
        deleteButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int index = table.getSelectedRow();
                System.out.println(index);
                model.removePerson(index);

            }
        });

        saveButton = new JXButton("Speichern");
        saveButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (JTextComponent component : components) {
                    component.setEditable(Boolean.FALSE);
                }
                for (JXButton button : buttons) {
                    if (button.isEnabled())
                        button.setEnabled(Boolean.FALSE);
                    else
                        button.setEnabled(Boolean.TRUE);
                }
                Person p = new Person(Integer.parseInt(idTextField.getText()), firstNameTextField.getText(),
                        lastNameTextField.getText(), DateUtil.parse(birthdayTextField.getText()));
                model.addPerson(p);
            }
        });
        saveButton.setEnabled(Boolean.FALSE);

        titleLabel = new JXLabel("Details");
        titleLabel.setFont(new Font("SansSerif", Font.BOLD, 16));

        GroupLayout rightHandSidePanelGroupLayout = new GroupLayout(rightHandSidePanel);
        rightHandSidePanelGroupLayout.setHorizontalGroup(
            rightHandSidePanelGroupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(rightHandSidePanelGroupLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.LEADING)
                        .addComponent(titleLabel, GroupLayout.DEFAULT_SIZE, 392, Short.MAX_VALUE)
                        .addGroup(Alignment.TRAILING, rightHandSidePanelGroupLayout.createSequentialGroup()
                            .addComponent(saveButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(deleteButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(editButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(newButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addGroup(Alignment.TRAILING, rightHandSidePanelGroupLayout.createSequentialGroup()
                            .addComponent(idLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(idTextField, GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE))
                        .addGroup(Alignment.TRAILING, rightHandSidePanelGroupLayout.createSequentialGroup()
                            .addComponent(firstNameLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(firstNameTextField, GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE))
                        .addGroup(Alignment.TRAILING, rightHandSidePanelGroupLayout.createSequentialGroup()
                            .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.LEADING)
                                .addComponent(lastNameLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                .addComponent(birthdayLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.LEADING)
                                .addComponent(birthdayTextField, GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE)
                                .addComponent(lastNameTextField, GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE))))
                    .addContainerGap())
        );
        rightHandSidePanelGroupLayout.setVerticalGroup(
            rightHandSidePanelGroupLayout.createParallelGroup(Alignment.TRAILING)
                .addGroup(rightHandSidePanelGroupLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(titleLabel)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(idLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(idTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(firstNameLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(firstNameTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(lastNameLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(lastNameTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(birthdayLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(birthdayTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED, 134, Short.MAX_VALUE)
                    .addGroup(rightHandSidePanelGroupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(newButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(editButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(deleteButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addComponent(saveButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addContainerGap())
        );
        rightHandSidePanelGroupLayout.linkSize(SwingConstants.VERTICAL, new Component[] {newButton, editButton, deleteButton, saveButton});
        rightHandSidePanelGroupLayout.linkSize(SwingConstants.VERTICAL, new Component[] {idLabel, firstNameLabel, lastNameLabel, birthdayLabel});
        rightHandSidePanelGroupLayout.linkSize(SwingConstants.HORIZONTAL, new Component[] {newButton, editButton, deleteButton, saveButton});
        rightHandSidePanelGroupLayout.linkSize(SwingConstants.HORIZONTAL, new Component[] {idLabel, firstNameLabel, lastNameLabel, birthdayLabel});
        rightHandSidePanel.setLayout(rightHandSidePanelGroupLayout);

        components.add(idTextField);
        components.add(firstNameTextField);
        components.add(lastNameTextField);
        components.add(birthdayTextField);

        buttons.add(deleteButton);
        buttons.add(saveButton);
        buttons.add(newButton);
        buttons.add(editButton);
    }
}
 
Zeile 83 holst du Dir einen Index … den prüfst du aber nicht und rufst dann in Zeile 84 auch den Index -1 auf.

Da also den Index prüfen!
 
Ich habe das jetzt mal wie folgt umgebaut:

Java:
if (index != -1) {
    Person p = model.getPerson(index);
    idTextField.setText(Integer.toString(p.getId()));
    firstNameTextField.setText(p.getFirstName());
    lastNameTextField.setText(p.getLastName());
    birthdayTextField.setText(DateUtil.format(p.getBirthday()));
} else
    System.err.println("Fehler")

Dann erscheint bei mir auf der Konsole:

Code:
Fehler
Fehler
Fehler
Fehler

Irgendwie verstehe ich das nicht?
 
Was verstehst Du nicht?
Warum der Index -1 ist. In der Zeile 159 der Klasse PersonOverviewPanel lasse ich mir bei einem Klick auf deleteButton den Index ausgeben. Dort wird der korrekte Index nach dem Löschen ausgegeben. Die Ausgabe lautet dann

2
2
2
-1
Fehler
Fehler

-1
Fehler-1

Fehler-1


Es wird anscheinend das Löschen mehrfach aufgerufen?
 
Java:
int index = table.getSelectedRow();
Vermutlich gibt es keine Selection mehr, wenn die selektierte Zeile gelöscht wird.
 
Ich denke eher, dass beim Löschen die Selection mehrfach angepasst wird. Und dadurch kommen die Aufrufe zustande. Aber ich habe mir Deinen Code nicht im Detail angesehen sondern nur selektiv das, was für den Fehler wichtig war.

Generell willst Du ja nur, dass bei einem selektierten Eintrag die Details auch in Textfelder übernommen werden. Daher reicht da doch tatsächlich eine Prüfung aus, ob ein Element selektiert wurde. Ist das nicht der Fall (Index -1), dann gehst Du raus bzw. leerst auch die Textfelder oder so.

Eine Ausgabe ist da also nicht notwendig. Es ist auch eine ganz normale Sache, dass nach dem Löschen des selektierten Eintrages eben kein Eintrag mehr selektiert ist. Und wenn man eine Ausgabe macht: Dann bitte immer mehr als nur "Fehler!". Schreib da doch etwas sinnvolles wie "Selektierter Index -1" oder so.
 
Der Block
Java:
 table.setCellSelectionEnabled(true);
        ListSelectionModel cellSelectionModel = table.getSelectionModel();
        cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                int index = table.getSelectedRow();
                Person p = model.getPerson(index);
                idTextField.setText(Integer.toString(p.getId()));
                firstNameTextField.setText(p.getFirstName());
                lastNameTextField.setText(p.getLastName());
                birthdayTextField.setText(DateUtil.format(p.getBirthday()));
            }
        });
scheint das Problem zu sein.
 
Ich habe jetzt einen MouseListener an der Tabelle registriert:
Java:
table.addMouseListener(this);
Und dann
Java:
@Override
    public void mouseClicked(MouseEvent e) {
        int index = table.getSelectedRow();
        // Person p = model.getPerson(index);
        if (index != -1) {
            Person p = model.getPerson(index);
            idTextField.setText(Integer.toString(p.getId()));
            firstNameTextField.setText(p.getFirstName());
            lastNameTextField.setText(p.getLastName());
            birthdayTextField.setText(DateUtil.format(p.getBirthday()));
        } else
            System.err.println("Fehler");
    }
Dann klappt alles.
Danke für eure Geduld und Unterstützung 😉
 
Was genau macht dein Programm?

Sieht interessant aus der Code.

Kannst du den ganzen Code posten? Würde mir gerne den Code etwas näher ansehen, wäre gut.

Als .zip natürlich am besten.
 

Neue Themen


Zurück
Oben