0

Я делаю проект Swing. Наверное, он слишком большой, чтобы вставляться здесь. Я даже пытался записать table.getSelectedRow(), и он показывал правильный индекс. Но каким-то образом, когда я нажимаю кнопку удаления, которая приводит к методу удаления, вызываемому в этом классе, выбранный параметр изменяется в -1, и я получаю исключение IndexOutOfBoundsException. Пожалуйста, помогите. Вот CarTableModelClass:Java Swing AbstractTableModel-IndexOutOfBounds исключение при удалении строки

import javax.swing.table.AbstractTableModel; 
import java.util.LinkedList; 

public class CarTableModel extends AbstractTableModel { 

public LinkedList<Car> cars=new LinkedList<Car>(); 
@Override 
public int getRowCount() { 
    return cars.size(); 
} 

@Override 
public int getColumnCount() { 
    return 4; 
} 

@Override 
public Object getValueAt(int row, int column){ 
    if((row>cars.size()-1) || (column>3)){ 
     return null; 
    } 
    else { 
     Car targetCar=cars.get(row); 
     switch (column){ 
      case 0: {return targetCar.brand;} 
      case 1: {return targetCar.year;} 
      case 2: { return targetCar.volume;} 
      case 3: {return targetCar.maxSpeed;} 
      default: {return null; } 
     } 

    } 
} 

@Override 
public Class<?> getColumnClass(int columnIndex){ 
    switch (columnIndex){ 
     case 0: {return String.class;} 
     case 1: {return Integer.class;} 
     case 2: { return Double.class;} 
     case 3: {return Double.class;} 
     default: {return Object.class; } 
    } 
} 
@Override 
public String getColumnName(int columnIndex){ 
    switch (columnIndex){ 
     case 0: {return "Brand";} 
     case 1: {return "Year";} 
     case 2: { return "Volume";} 
     case 3: {return "Max Speed";} 
     default: {return null; } 
    } 
} 


@Override 
public boolean isCellEditable(int rowIndex, int columnIndex){ 
    return false; 
} 

public void addRow(Car value) 
{ 
    if(value!=null) { 
     cars.add(value); 
     fireTableDataChanged(); 
    } 
} 

public void update(int index, Car car){ 
    if((car!=null) &&(index>=0)&& (index<(cars.size()-1))){ 
     cars.set(index,car); 
     fireTableRowsUpdated(index,index+1); 
    } 
} 

public void remove(int index){ 
    if((cars!=null) &&(index>=0)&& (index<(cars.size()-1))){ 
     cars.remove(index); 
     fireTableRowsDeleted(index,index+1); 
    } 
} 
} 

А вот исключения я получаю:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: -1, Size: 10 
at java.util.LinkedList.checkElementIndex(LinkedList.java:555) 
at java.util.LinkedList.get(LinkedList.java:476) 
at CarTableModel.getValueAt(CarTableModel.java:26) 
at MainWindow.lambda$new$0(MainWindow.java:51) 
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.removeIndexInterval(DefaultListSelectionModel.java:677) 
at javax.swing.JTable.tableRowsDeleted(JTable.java:4509) 
at javax.swing.JTable.tableChanged(JTable.java:4412) 
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:296) 
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:261) 
at CarTableModel.remove(CarTableModel.java:83) 
at Toolbar.actionPerformed(Toolbar.java:45) 
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:252) 
at java.awt.Component.processMouseEvent(Component.java:6535) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6300) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4891) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4713) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2750) 
at java.awt.Component.dispatchEvent(Component.java:4713) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
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:76) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:731) 
at java.awt.EventQueue$4.run(EventQueue.java:729) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
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) 
-1 

UPD: Вот лямбда в строке 51:

table.getSelectionModel().addListSelectionListener((event)-> 
    { 
     int row=table.getSelectedRow(); 
     formPanel.setSelectedRow(row); 
     toolbar.setSelectedRow(row); 
     System.out.println(row); 
     formPanel.fill(
       model.getValueAt(row,0), 
       model.getValueAt(row,1), 
       model.getValueAt(row,2), 
       model.getValueAt(row,3) 
     ); 

    }); 

Дело в том, что я не могу остановить его от возврата -1.

+1

Прочитайте трассировку стека: lambda в 'MainWindow', в строке 51, вызывает' getValueAt() 'с -1 как аргумент. –

+0

Похоже, что строка была успешно удалена с помощью 'CarTableModel.remove', но затем она вызывает« fireTableRowsDeleted », которая, в свою очередь, вызывает какой-то метод в« MainWindow », который затем вызывает« CarTableModel.getValueAt », но по мере удаления строки он выдает исключение. Вы уже проверяете значения «row» или «column», которые слишком велики, а затем возвращаются из этого метода, ничего не делая. Если вы также проверяете отрицательные значения, все ли работает? –

+1

Если 'getSelectedRow()' возвращает -1, что означает, что нет выбранной строки, тогда вы не должны пытаться вызвать 'model.getValueAt()'. –

ответ

1

Похоже, что строка была успешно удалена CarTableModel.remove, но это вызывает fireTableRowsDeleted, который, в свою очередь, вызывающие некоторый метод в MainWindow, который затем вызывает CarTableModel.getValueAt, но как строка была удалена он бросает исключение. Вы уже проверяете значения слишком больших строк или столбца, а затем возвращаетесь из этого метода, не делая ничего. Если вы также проверяете отрицательные значения, все ли работает?

С другой стороны, как говорит @JBNeizet, метод по линии 51 MainWindow может испытать для отрицательных значений, а не затем вызвать CarTableModel.getValueAt, но если getValueAt вызывается из нескольких мест, то имеет смысл сделать проверку параметров в методе сам.