Hallo,
ich habe mir ein eigenes TableModel geschrieben, dieses erbt von AbstractTableModel.
Leider stoppt es bei mir, beim löschen einer Zeile aus dem Table.
Ich habe die Daten die in der Tabelle sind in einer ArrayList gespeichert.
Wird nun ein "Job" selektiert und es wird auf den "LÖschen-Button" geklickt, gibt der Controller den Command zum löschen an das Model weiter. Der Job wird zwar gelöscht, aber es wird eine Exception geworfen.
Exception:
Hier mal das Model:
Übergabe des Commands vom Controller
Ich habe es auch schon mit fireTableDataChanged() in der removeJob(Job job) Methode probiert, ebenfalls eine Exception.
Leider komme ich nicht weiter.
ich habe mir ein eigenes TableModel geschrieben, dieses erbt von AbstractTableModel.
Leider stoppt es bei mir, beim löschen einer Zeile aus dem Table.
Ich habe die Daten die in der Tabelle sind in einer ArrayList gespeichert.
Wird nun ein "Job" selektiert und es wird auf den "LÖschen-Button" geklickt, gibt der Controller den Command zum löschen an das Model weiter. Der Job wird zwar gelöscht, aber es wird eine Exception geworfen.
Exception:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index
at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source)
at javax.swing.JTable.convertRowIndexToModel(Unknown Source)
at javax.swing.JTable.getValueAt(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Hier mal das Model:
Java:
public class JobTableModel extends AbstractTableModel {
//Columns Number.
public static final int JOB_SEL_COL = 0;
public static final int JOB_NAME_COL = 1;
public static final int JOB_FOLDERS_COL = 2;
public static final int JOB_DATE_COL = 3;
private String[] columnNames = new String[]{"Upload", "Job Name", "Unterverzeichnisse", "Datum" };
private ArrayList<Job> jobList;
private ArrayList<Job> jobListSeleted;
private ArrayList<TableModelListener> tableListener = new ArrayList<TableModelListener>();
public JobTableModel(){
super();
this.jobList = new ArrayList<Job>();
this.jobListSeleted = new ArrayList<Job>();
this.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
int column = e.getColumn();
int row = e.getFirstRow();
//aktuellen Job holen
Job job = (Job) getValueAt(row);
if(job.isUpload()){
jobListSeleted.add(job);
System.out.println("JOB Seleted");
}else{
jobListSeleted.remove(job);
}
}
});
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return jobList.size();
}
/**
* Aktualisiert die Daten im TableModel
* nachdem diese in der Tabelle geändert
* wurden
*/
public void setValueAt(Object value, int row, int col){
Job job = jobList.get(row);
switch(col){
case JOB_SEL_COL: job.setUpload((Boolean)value); break;
case JOB_NAME_COL: job.setName((String)value); break;
case JOB_FOLDERS_COL: value.toString(); break;
case JOB_DATE_COL: job.setDate((String)value); break;
}
fireTableCellUpdated(row, col);
}
/**
* Gibt den Wert, welcher sich in den
* übergebenen Parametern befindet zurück
*
*/
@Override
public Object getValueAt(int row, int column) {
Job job = jobList.get(row);
String folders = "";
if(job.getSourceFolders().length > 0){
for (String folder : job.getSourceFolders()) {
if(folders.isEmpty())
folders += folder;
else
folders += "\n" + folder;
}
}
switch(column){
case JOB_SEL_COL: return job.isUpload();
case JOB_NAME_COL: return job.getName();
case JOB_FOLDERS_COL: return folders;
case JOB_DATE_COL: return job.getDate();
default: return new Object();
}
}
/**
* Gibt das Object zurück, was sich
* in der übergebenen Zeile befindet
*
* @param row
* @return
*/
public Object getValueAt(int row){
return jobList.get(row);
}
public String getColumnName(int iColumn){
return columnNames[iColumn];
}
// passendes Format in der Spalte wird angezeigt
public Class getColumnClass(int columnIndex){
switch(columnIndex){
case 0: return Boolean.class;
default: return String.class;
}
}
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
return col == 0;
}
public ArrayList<Job> getSelectedJobs() {
System.out.println("JobTableModel.getSelectedJobs() " + jobListSeleted.size());
return jobListSeleted;
}
public void setSelectedJobs(ArrayList<Job> arrlSelectedJobs) {
this.jobListSeleted = arrlSelectedJobs;
}
public ArrayList<Job> getJobList() {
return jobList;
}
/**
* Fügt einen Job in die
* ArrayList des Models hinzu
*
* @param job
*/
public void addJob(Job job){
jobList.add(job);
this.fireTableDataChanged();
}
/**
* Löscht einen bestehen Job aus
* der ArrayList des Models
*
* @param job
*/
public void removeJob(Job job) {
this.jobListSeleted.clear();
int jobIndex = -1;
for(Job aktJob : jobList){
if(aktJob.getName().equals(job.getName())){
jobIndex = jobList.indexOf(aktJob);
System.out.println("JOB gefunden: " + job.getName());
}
}
jobList.remove(jobIndex);
fireTableRowsDeleted(jobIndex, jobIndex);
}
}
Übergabe des Commands vom Controller
Java:
public void removeJob(Job job) {
view.getTable().getModel().removeJob(job);
}
Ich habe es auch schon mit fireTableDataChanged() in der removeJob(Job job) Methode probiert, ebenfalls eine Exception.
Leider komme ich nicht weiter.