AbstractTableModel Exception in thread "AWT-EventQueue-

Status
Nicht offen für weitere Antworten.

Lony

Neues Mitglied
Hallo,

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
 
Versuch's mal so:
Code:
public void deleteFeed(int rowIndex) {
    if(rowIndex < 0)return;
    ...
 
Funktioniert bei mir. Ich habe deinen Code kopiert, die gezeigte Änderung gemacht und noch folgende Zeile eingebaut:
Code:
feedTable.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), KEY_STROKE_DELETE);
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben