2

列で並べ替えた後の電話帳アプリケーションで、行を削除してモデルを調整updateUI()すると、モデルが取得java.lang.IndexOutOfBoundsExceptionされました。しかし、ソートしていない場合、例外はありません。オブジェクトが削除されたと思いますが、updateUI プロシージャではgetRowCount()それを認識せず、スタックトレースによると、どこかで古いものが返されます。

    private void delete(int[] selectedIndexes) {
            ArrayList<Contact> arlDeleting = new ArrayList<Contact>();
            for (int i = selectedIndexes.length - 1; i >= 0; i--) {
                int realIndex = tblPhonebook.convertRowIndexToModel(selectedIndexes[i]);
                tblMdlAllContacts.getData().remove(realIndex);
            }

            tblPhonebook.updateUI();
        }

ここにスタックトレースがあります:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at com.TableModelPhoneBook.getValueAt(TableModelPhoneBook.java:73)     ***
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)           *** i think getRowCount called here
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.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(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.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$700(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.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$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$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)

および model.getvalueat:

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Contact temp = data.get(rowIndex);                 // here is where error occurs
    switch (columnIndex) {
    case 0:
        return temp.getFirstName();
    case 1:
        return temp.getLastName();
    case 2:
        return temp.getMobile();
    case 3:
        return temp.getHome();
    case 4:
        return temp.getAddress();
    default:
        break;
    }
    return null;
}
4

1 に答える 1

3

updateUI()これは L&F が変更されたときにのみ呼び出されるため、呼び出さないでください。行削除メソッドはモデルの一部ですよね? 削除後にモデルのfireXXX()通知メソッドを起動していますか? あなたがする必要があります。また、イテレータを使用して削除を行うべきかどうか疑問に思います。


あなたの状態を編集
:

私のコントローラーにはdeleteメソッドがありません(間違っていますか?)。

違う。メソッドはテーブルモデルの一部である必要があり、コントローラーはモデルでこのメソッドを呼び出すことができますが、このメソッドを持つべきではありません。テーブル モデルは AbstractTableModel を拡張し、データが削除、追加、または変更されたときに適切な fireXXX メソッドを呼び出す必要があります。削除の場合は、fireTableRowsDeleted メソッドを呼び出し、AbstractTableModel APIで利用可能なすべての通知メソッドの詳細を確認してください。

「updateUI()」行を削除しました。テーブルのセルをクリックするまでは問題ありません。これを行うと、例外がスローされました。実際には「firexxx()」が原因ですよね?

いいえ、あなたのコードが何をしているのか、またはあなたの例外の原因が今のところわかりません。sscceを作成して投稿することを検討してください。

ああ、そうです。しかし、「table.getModel()」を呼び出すと、「fireXXX()」が表示されませんが、モデルインスタンスへの参照によって表示されるのはなぜですか。「mymodel.fireTableDataChanged()」

外部クラスは fire メソッドを呼び出さないでください。モデル自体は、独自の通知メソッドを呼び出す唯一のオブジェクトでなければなりません。

JTable のチュートリアルをまだ読んでいない場合は、すぐに試してみることをお勧めします。それはあなたに大いに役立ちます。

于 2013-08-03T13:27:54.697 に答える