Hallo,
ich habe Probleme beim löschen eines Elements aus meiner JTable durch ein Button.
Das ist die Aktion des Buttons.
Das Tabellen Modell - speziell deleteFeed() ist wichtig
Die Verursachte Exception
Ihrgendie tritt bei fireTableRowsDeleted in deleteFeed() diese Exception auf? Hat jemand eine Idee warum, die Row wird doch richtig gefunden?
Grüße Lony
ich habe Probleme beim löschen eines Elements aus meiner JTable durch ein Button.
Das ist die Aktion des Buttons.
Code:
AbstractAction actionDel = new AbstractAction("Del") {
private static final long serialVersionUID = 1311557294745524560L;
@Override
public void actionPerformed(ActionEvent e) {
if (DEBUG) begin(LOG, e);
int row = feedTable.getSelectedRow();
if (DEBUG) LOG.debug("Feed in Zeile '" + row + "' gelöscht.");
feedModel.deleteFeed(row);
// feedDataModel.setFeedDataList(new ArrayList<FeedData>());
if (DEBUG) end(LOG, row);
}
};
feedDelButton.setAction(actionDel);
feedTable.getActionMap().put(KEY_STROKE_DELETE, actionDel);
Das Tabellen Modell - speziell deleteFeed() ist wichtig
Code:
package rssCrawler.controller;
import static util.LogUtil.beginTrace;
import static util.LogUtil.endTrace;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import rssCrawler.model.Feed;
public class FeedTableModel extends AbstractTableModel {
private static final long serialVersionUID = -6736682383186152972L;
private static final Log LOG = LogFactory.getLog(FeedTableModel.class);
private static final boolean TRACE = LOG.isTraceEnabled();
private static final String DATE_FORMAT = "dd.MM.yyyy HH:mm";
private static final SimpleDateFormat dateFormater = new SimpleDateFormat(DATE_FORMAT);
private List<Feed> feeds = new ArrayList<Feed>();
public List<Feed> getFeeds() {
return feeds;
}
public void setFeeds(List<Feed> feeds) {
this.feeds = feeds;
// Listeners benachrichtigen
this.fireTableDataChanged();
}
public void addFeed(Feed feed) {
if (TRACE) beginTrace(LOG, feed);
int index = feeds.size();
feeds.add(feed);
// Listeners benachrichtigen
this.fireTableRowsInserted(index, index);
if (TRACE) endTrace(LOG);
}
public void deleteFeed(int rowIndex) {
if (TRACE) beginTrace(LOG, rowIndex);
//keine Feeds mehr vorhanden
if (this.getRowCount() == 0)
return;
feeds.remove(rowIndex);
// Listeners benachrichtigen
this.fireTableRowsDeleted(rowIndex, rowIndex);
if (TRACE) endTrace(LOG);
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public int getRowCount() {
return feeds.size();
}
public String getColumnName(int column) {
switch (column) {
case 0:
return "Titel";
case 1:
return "Last Updated";
case 2:
return "URL";
default:
return null;
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (TRACE) beginTrace(LOG, rowIndex, columnIndex);
Feed feed = (Feed) feeds.get(rowIndex);
switch (columnIndex) {
case 0:
return feed.title;
case 1:
return dateFormater.format(feed.lastSynced);
case 2:
return feed.feedLocation;
default:
return null;
}
}
@SuppressWarnings("unchecked")
public Class getColumnClass(int columnIndex) {
if (TRACE) beginTrace(LOG, columnIndex);
switch (columnIndex) {
case 0:
return String.class;
case 1:
return SimpleDateFormat.class;
case 2:
return String.class;
default:
return null;
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (TRACE) beginTrace(LOG, aValue, rowIndex, columnIndex);
Feed feed = (Feed) feeds.get(rowIndex);
//write only "Title" and "URL" column data
switch (columnIndex) {
case 0:
feed.title = ((String) aValue).toString();
// Listeners benachrichtigen
this.fireTableCellUpdated(rowIndex, columnIndex);
break;
case 2:
feed.feedLocation = ((String) aValue).toString();
// Listeners benachrichtigen
this.fireTableCellUpdated(rowIndex, columnIndex);
break;
}
if (TRACE) endTrace(LOG);
}
}
Die Verursachte Exception
Code:
TRACE controller.FeedTableModel - BEGIN getColumnClass: 0
TRACE controller.FeedTableModel - BEGIN getValueAt: 0, 0
TRACE controller.FeedTableModel - BEGIN getColumnClass: 0
TRACE controller.FeedTableModel - BEGIN getValueAt: 0, 0
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.get(ArrayList.java:324)
at rssCrawler.view.RSSCrawler$2.valueChanged(RSSCrawler.java:149)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:137)
at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(DefaultListSelectionModel.java:668)
at javax.swing.JTable.restoreSortingSelection(JTable.java:4157)
DEBUG view.RSSCrawler - BEGIN actionPerformed: java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=Del,
when=1229168484812,modifiers=Button1] on javax.swing.JButton[,166,5,47x23,....]
DEBUG view.RSSCrawler - Feed in Zeile '0' gelöscht.
TRACE controller.FeedTableModel - BEGIN deleteFeed: 0
TRACE view.RSSCrawler - BEGIN valueChanged: javax.swing.event.ListSelectionEvent[
source=javax.swing.DefaultListSelectionModel 21363001 ~{} firstIndex= 0 lastIndex= 0 isAdjusting= true ]
TRACE view.RSSCrawler - END valueChanged: -1
TRACE view.RSSCrawler - BEGIN valueChanged: javax.swing.event.ListSelectionEvent[
source=javax.swing.DefaultListSelectionModel 21363001 ~{} firstIndex= -1 lastIndex= 0 isAdjusting= true ]
TRACE view.RSSCrawler - END valueChanged: -1
TRACE view.RSSCrawler - BEGIN valueChanged: javax.swing.event.ListSelectionEvent[
source=javax.swing.DefaultListSelectionModel 21363001 ~{} firstIndex= -1 lastIndex= 0 isAdjusting= true ]
TRACE view.RSSCrawler - END valueChanged: -1
TRACE view.RSSCrawler - BEGIN valueChanged: javax.swing.event.ListSelectionEvent[
source=javax.swing.DefaultListSelectionModel 21363001 ={} firstIndex= -1 lastIndex= 0 isAdjusting= false ]
at javax.swing.JTable.access$500(JTable.java:198)
at javax.swing.JTable$SortManager.restoreSelection(JTable.java:3961)
at javax.swing.JTable$SortManager.processChange(JTable.java:3935)
at javax.swing.JTable.sortedTableChanged(JTable.java:4067)
at javax.swing.JTable.tableChanged(JTable.java:4333)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:245)
at rssCrawler.controller.FeedTableModel.deleteFeed(FeedTableModel.java:62)
at rssCrawler.view.RSSCrawler$4.actionPerformed(RSSCrawler.java:251)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6041)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5806)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4413)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4243)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2440)
at java.awt.Component.dispatchEvent(Component.java:4243)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Ihrgendie tritt bei fireTableRowsDeleted in deleteFeed() diese Exception auf? Hat jemand eine Idee warum, die Row wird doch richtig gefunden?
Grüße Lony