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!
 

KonradN

Super-Moderator
Mitarbeiter
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.
 

padde479

Bekanntes Mitglied
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);
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
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!
 

padde479

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

padde479

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

Oneixee5

Top Contributor
Java:
int index = table.getSelectedRow();
Vermutlich gibt es keine Selection mehr, wenn die selektierte Zeile gelöscht wird.
 

KonradN

Super-Moderator
Mitarbeiter
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.
 

padde479

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

padde479

Bekanntes Mitglied
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 ;)
 

Devanther

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
S Zeile entfernen aus JTable Java Basics - Anfänger-Themen 15
Glühlampe Usereingabe in der gleichen Zeile ausgeben Java Basics - Anfänger-Themen 6
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
G Compiler-Fehler Fehler in Zeile 1 beheben, wie? Java Basics - Anfänger-Themen 9
I Wortkette in umgekehrter Rheinfolge + in neuer Zeile ausgeben Java Basics - Anfänger-Themen 4
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
M Spezifischen Wert einer Zeile aus .txt Datei entnehmen Java Basics - Anfänger-Themen 15
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
LFB In einer For-Schleife alles in einer Zeile ausgeben Java Basics - Anfänger-Themen 14
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
G JTable, Zeile auswählen und Ergebnis an Schaltfläche übergeben Java Basics - Anfänger-Themen 4
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
dieter000 Wie schreibe ich diese ZEile um? Java Basics - Anfänger-Themen 1
crrnogorka Letzte Zeile einer Tabelle "überschreibt" alle anderen Zeilen Java Basics - Anfänger-Themen 1
M In gleicher zeile hinter ausgabe noch etwas ausgeben Java Basics - Anfänger-Themen 1
P Welche Zeile in Tadople gibt einen compiler error? Java Basics - Anfänger-Themen 5
I ArrayList erstellen innerhalb einer Zeile? Java Basics - Anfänger-Themen 3
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
S Gesamten String in einer Zeile ausgeben Java Basics - Anfänger-Themen 2
J ObjectOutputStream writeChars, komische Zeichen nur in 1. Zeile Java Basics - Anfänger-Themen 2
T Was macht diese Zeile? Java Basics - Anfänger-Themen 9
A Jede x-te Zeile, lösche 10 Zeilen Java Basics - Anfänger-Themen 9
L Tiefe Kopie einer Zeile eines zweidimensionalen Arrays Java Basics - Anfänger-Themen 1
B Code Zeile unklar Java Basics - Anfänger-Themen 9
ruutaiokwu Ausgegebene Zeile ersetzen mit neuem Text Java Basics - Anfänger-Themen 3
F Zeile in Ordner Java Basics - Anfänger-Themen 4
jaleda100 JTextArea Zeile einfügen Java Basics - Anfänger-Themen 1
M BufferedReader neue Zeile nach Knopfdruck Java Basics - Anfänger-Themen 9
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Java liest nur eine Zeile ein Java Basics - Anfänger-Themen 3
M Aus Datei auslesen und untersuchen ob diese Zeile schon vorhanden ist Java Basics - Anfänger-Themen 3
B Wieso wird die Zeile "column" genannt und die Spalte "line"? Java Basics - Anfänger-Themen 12
S BufferedReader nächste Zeile lesen Java Basics - Anfänger-Themen 4
M Zeile in datei überschreiben Java Basics - Anfänger-Themen 5
S drawString() neue Zeile Java Basics - Anfänger-Themen 4
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
D JTable Zeile wird nicht in MySQL gelöscht Java Basics - Anfänger-Themen 16
J Durchschnitt jeder Zeile und und Spalte in einem 2D Arrays berechnen Java Basics - Anfänger-Themen 6
W String in einer Zeile mit Alphabet füllen? Java Basics - Anfänger-Themen 8
snipesss [Java] Schriftart und Schriftgröße von JLabel in einer Zeile festlegen? Java Basics - Anfänger-Themen 3
H Variablen Zeile aus einem ResultSet ausleesen Java Basics - Anfänger-Themen 7
E Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons Java Basics - Anfänger-Themen 7
R Ab einer bestimmten Zeile lesen Java Basics - Anfänger-Themen 3
T Zeilen des ListArray nach einem Wort durchsuchen und diese Zeile ausgeben Java Basics - Anfänger-Themen 4
C Datentypen Zeile aus mehrdimensionalem Array extrahieren uns abspeichern Java Basics - Anfänger-Themen 6
B FileInputStream entpacken und Zeile für Zeile entpacken Java Basics - Anfänger-Themen 1
Crazynet jTable erste Zeile mit deffinierten Werten Java Basics - Anfänger-Themen 0
S In JTable Zeile selektieren mit Mausklick Java Basics - Anfänger-Themen 16
D Datenbankzugriff - Leere Zeile einfügen Java Basics - Anfänger-Themen 2
G zeichen einer Zeile löschen Java Basics - Anfänger-Themen 4
F Zeile bei JTable hinzufügen Java Basics - Anfänger-Themen 6
A CSV datei eine Bestimmte Zeile ansprechen Java Basics - Anfänger-Themen 1
J Input/Output Zeile in Textdatei ändern Java Basics - Anfänger-Themen 14
S Java CSV, er nimmt die nächste Zeile nicht Java Basics - Anfänger-Themen 2
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
G Zeile charweise lesen Java Basics - Anfänger-Themen 3
Ananaskirsche Input/Output Bestimmte Zeile aus Datei einlesen Java Basics - Anfänger-Themen 4
G Leere Zeile lesen Java Basics - Anfänger-Themen 12
G zeile: Was bedeutet das in der Methode? Java Basics - Anfänger-Themen 4
S Farbe eine Zeile in JTable ändern, wenn JButton geklickt wurd Java Basics - Anfänger-Themen 4
T Textdatei Zeile löschen? Java Basics - Anfänger-Themen 4
C Input/Output Hilfe..txt Datei zeile verändern und Ausgabe ..Hilfe Java Basics - Anfänger-Themen 11
N Bestimmte Zeile aus einer Datei auslesen Java Basics - Anfänger-Themen 10
L Ansprechung der x'ten Zeile in Arrays Java Basics - Anfänger-Themen 10
S Textdatei lesen, Methode gibt nur die letzte Zeile aus. Warum? Java Basics - Anfänger-Themen 5
G JTable: Inhalt einer selektierten Zeile speichern Java Basics - Anfänger-Themen 2
J Neue Zeile an bestimmter Stelle in Textdatei einfügen Java Basics - Anfänger-Themen 2
N Erste Zeile bei BufferedReader doppelt lesen? Java Basics - Anfänger-Themen 2
I .txt Datei Zeile löschen. Java Basics - Anfänger-Themen 13
B Geschwindigkeitsabhängigkeit von Anz. d. Operatoren pro Zeile Java Basics - Anfänger-Themen 12
D Bestimmte Zeile aus TXT Datei ausgeben Java Basics - Anfänger-Themen 4
H Input/Output JTextArea einzelne Zeile auslesen Java Basics - Anfänger-Themen 6
Rayo Lese Zahl in Zeile x aus Spalte y ein! Java Basics - Anfänger-Themen 36
T Erste Schritte Ende von Wörtern in einer Zeile feststellen? Java Basics - Anfänger-Themen 5
N User Eingabe mit Zeile aus TextFile vergleichen Java Basics - Anfänger-Themen 13
L warum werden nicht die neuen Point Daten der Zeile 25 beim ausprinten Zeile 28 übernommen ? Java Basics - Anfänger-Themen 8
Kenan89 Bestimmte Zeile in txt-Datei ersetzen Java Basics - Anfänger-Themen 4
G Bitte um Erklärung dieser einer Zeile Java Basics - Anfänger-Themen 5
D Input/Output bestimmte Zeile auslesen Java Basics - Anfänger-Themen 3
G Ausgabe nach 5 Zeichen in neue Zeile schreiben??? Java Basics - Anfänger-Themen 12
H Zeile aus Textdatei lesen und in Textfield schreiben Java Basics - Anfänger-Themen 4
B Erste Schritte Kosolennanwenung nur eine Zeile Java Basics - Anfänger-Themen 9
W letzte Zeile aus wachsender Textdatei auslesen Java Basics - Anfänger-Themen 5
S Itext und eine neue Zeile einfügen Java Basics - Anfänger-Themen 2
B Aus Text Zeile einen String herauslesen Java Basics - Anfänger-Themen 11
W Eingabe und Ausgabe in eine Zeile Java Basics - Anfänger-Themen 4
Corben Input/Output FileOutputStream - neue Zeile mit write(10) Java Basics - Anfänger-Themen 6
K Erste Schritte Array mit 3 werte in eine Zeile -- Hilfe! Java Basics - Anfänger-Themen 2
G Was bedeutet diese Zeile? Java Basics - Anfänger-Themen 2
E Zeile innerhalb Datei überschreiben Java Basics - Anfänger-Themen 2
P Kann Ziffer die am Ende einer Zeile steht (.txt) nicht in int übersetzen Java Basics - Anfänger-Themen 11
F In der Zeile des Ausführers bleiben? Java Basics - Anfänger-Themen 6
A InputStream gibt nur jede 2te Zeile aus Java Basics - Anfänger-Themen 7
J Jede Zeile der Textdatei in ListUI eintragen Java Basics - Anfänger-Themen 2
A OOP Arraybefüllung mit for-Schleifen Problem: Umsprung in die zweite Zeile Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben