2016-03-29 11 views
0

私はSwingプロジェクトを作成しています。おそらく、ここにペーストするには大きすぎます。私はtable.getSelectedRow()をログに記録しようとしても、正しいインデックスを表示していました。しかし、どういうわけか、このクラスで呼び出されたremoveメソッドにつながるdeleteボタンを押すと、selectedRowが-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

スタックトレースを読みます:51行目の 'MainWindow'のラムダは引数として-1を指定して' getValueAt() 'を呼び出しています。 –

+0

行が 'CarTableModel.remove'によって正常に削除されたように見えますが、' fireTableRowsDeleted'を呼び出します。 'MainTextModel.getValueAt'を呼び出す' MainWindow'のメソッドを呼び出しますが、行は削除されていますそれは例外をスローします。大きすぎる 'row'または' column'の値をすでにテストしてから、何もせずにそのメソッドから戻ってきます。負の値もテストすれば、すべてが機能しますか? –

+1

'getSelectedRow()'が-1を返した場合、選択された行がないことを意味するので、 'model.getValueAt()'を呼び出すべきではありません。 –

答えて

1

それは、行が正常にCarTableModel.removeによって削除されたように見えますが、これは順番に、その後CarTableModel.getValueAtを呼び出すMainWindowでいくつかのメソッドを呼び出すfireTableRowsDeletedを呼び出しますが、行が削除されているとして、それは例外をスローします。あまりにも大きい行または列の値をテストしてから、何もせずにそのメソッドから戻ってきます。負の値もテストすれば、すべてが機能しますか? @JBNeizetが言うように

あるいは、MainWindowのライン51上の方法は、負の値をテストできず、その後CarTableModel.getValueAtを呼び出しますが、getValueAt場合メソッドのパラメータの検証を行うために、それは理にかなっている複数の場所から呼び出されています自体。

関連する問題