2010-12-20 21 views
0

ここに私の最初の質問があります。まず第一に、私はJavaで新しく、まだイベントを理解するのに苦労しています。私は、カスタムツールヒント(異なる列からのデータの組み合わせ)を表示するために、TableModelListenerとカスタムTableCellRendererを実装するCustomTableModelHandlerであるAbstractTableModelを拡張するカスタムモデルをJTableに持っています。ユーザーは1行の選択のみを行うことができ、オプションautocreaterowsorterをチェックしました。行を削除するとき、私は、このメソッドを使用します。原因は何ですか

public void removeRow(int modelIndex) { 
    fireTableRowsDeleted(modelIndex, modelIndex); 
    rowData.remove(modelIndex); 
} 
私は最初のデータ変更イベントをトリガーした理由は、私は私が削除しようとしてるの行からのデータが含まれているテキストでのJLabelを(更新したいということです

おそらくよりエレガントな方法があります)。私は常にモデルインデックスの行を渡している、私はビュー内の選択をクリアしようとしたが、それは助けにはなりませんでした。私は時代の100%のエラーを再現するように見えることはできませんが、それは行を編集した後、ほとんどの時に起こるようですが、列をアクティブにソートし、次に行を削除します(これは実際にはエラー発生する)。

問題は次のようなものです。問題の原因はどうすればわかりますか?コード全体が少し大きすぎてここに投稿することはできませんが、誰かがそれを見たいと思っていれば提供することができます。 (多くの時間を表示されます)

エラー:

run: 
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
     at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
     at java.util.ArrayList.get(ArrayList.java:322) 
     at Contacts.ContactsGUI$CustomTableModel.getValueAt(ContactsGUI.java:1975) 
     at javax.swing.JTable.getValueAt(JTable.java:2686) 
     at javax.swing.JTable.prepareRenderer(JTable.java:5703) 
     at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072) 
     at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974) 
     at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1770) 
     at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143) 
     at javax.swing.JComponent.paintComponent(JComponent.java:752) 
     at javax.swing.JComponent.paint(JComponent.java:1029) 
     at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124) 
     at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479) 
     at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410) 
     at javax.swing.RepaintManager.paint(RepaintManager.java:1224) 
     at javax.swing.JComponent._paintImmediately(JComponent.java:5072) 
     at javax.swing.JComponent.paintImmediately(JComponent.java:4882) 
     at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785) 
     at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713) 
     at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693) 
     at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

答えて

0

私が最初にデータ変更イベントを発生させる理由は、私が削除しようとしている行のデータを含むテキストでJLabelを更新したいということです(おそらくもっとエレガントな方法です)。

この機能はTableModelの一部であってはなりません。削除ロジックを呼び出すボタンは、行削除メソッドを呼び出す前に必要な情報を保存する必要があります。次に、removeRow()コードは、テーブル行削除イベントを発生させる前にrowDataからその行を削除する必要があります。

が、それは私が行を編集した後、それは時間のほとんどを起こるようで、アクティブソート列がありますし、次にあなたが行モデルに行ビューを変換する必要がある行

を削除します。私はコードが次のようなものでなければならないと思う:

int modelRow = tableConvertRowIndexToModel(selectedRow); 
rowData.remove(modelRow); 
fireTableRowsDeleted(modelRow, modelRow); 
+0

私は常に行の変換をモデル化するためのビューを行っていますが、私の問題を解決したと思うもう一つのヒントです。データを保存し、行を削除して変更を実行すると、エラーが発生していないようです。私はこれが原因だと思う:テーブルが再描画されている間に、私も行を削除していた。ありがとう。 – Max

3

あなたのスタックトレースからはIndexOutOfBoundsException

なっています。つまり、配列の長さよりも大きい配列のインデックスを参照しています。

これは、行を削除した後に発生する可能性があります。行を削除すると、削除された行の後のすべての行の索引が変更されることに注意してください。すなわち

、あなたが持っている場合

0 - ROW1
1 - ROW2
2 - ROW3
3 - ROW4

もしインデックス1で行を削除した場合

、あなたのテーブルには、次のようになります

0 - 行1
1 - ROW3 < - 変化に注意し
2 - ROW4

+0

"0 - 行1 1 - 行3 2 - 行4"を意味しないのですか?もちろん@jean、 –

+0

です。ダニット。それを指摘するための高齢者。 – hvgotcodes

+0

はい、私が理解しているエラーは、getValueAtメソッドを呼び出すことができませんでしたが、私はかなり確信しています:テーブルが再描画されたため、データの変更が発生し、しかし、私の事例では、もう1つのことを実感できました。私はあなたの例のように "真ん中"の行を削除したときにエラーは起こりませんでした。しかし、それがモデルの最後の行だったとき(常に、範囲外のインデックスを持つgetValueAt()を呼び出す原因となります)。別の行を削除することによって、リストは再索引付けされ、「削除された」索引があった値が検索されます。ヘルプの人のためのThx。 – Max

0

最初は、ContactsGUI.java行1975を参照してください。これが、例外がスローされる場所です。そこで参照されているArrayListを参照してください。次に、そのリストのサイズが決まる場所と、そのリストからアクセスする要素を決める方法を調べなければなりません。

IDEを使用している場合は、その行にブレークポイントを設定し、アプリをデバッグしてください

+0

私はブレークポイントを設定しようとしましたが、その時点で、メソッドが外れているインデックスで値を取得しようとしていることしかわかりませんでした。 Camickrは私を正しい方向へ向ける:変化を起こし、変化を起こすのは悪い考えだった。 – Max