2011-10-24 4 views
1

私の問題を解決できるかのように見えていたスレッドをすべて読んだが、ここですべての答えを読んだが、私はまだウィット終わり。私はthreadingと関係があると感じていますが、例外がスローされる理由はわかりません。そうであれば、new Runnable()をどこに含めるべきか、invokeLater()またはinvokeAndWait()にするかどうか教えてください。私は役に立たないようにしました。ArrayIndexOutOfBoundsException:-1 JTableの作成時/テーブル交換の場合

例外とスタックトレース(以下)につながるコードを私に渡してください。

EDIT:私はtableChangedが呼び出されると、彼らは、コンソールには表示されません直前AnnoTableセクションでsyso秒の数を含めていた、それゆえ私は、問題は、アプリケーションがそれになっても前に発生しなければならないと思います問題が上書きtableChanged方法であった:ポイント、それはAAViewまたはデータおよびテーブルモデルから呼ばれていますつまり、どちらかが...

EDIT IIをインスタンス化しています。それは明らかに例外を発生させるでしょう。私はtableChanged()呼び出しを削除しました(違いはありません)。今私はもう一つの問題があります:基礎となるデータ(AnnoData)の変更がどのようにテーブルを自動的に更新できるかを理解する。これはおそらく別のクエリ(拡張されたGoogleの検索の後)ですが、このスレッドに役立つコメントを投稿してください。私はこれを読んでいきます...参考にしてください。

EDIT III:*私はこの問題を解決しました。 AnnoDataから別のオブジェクトをインスタンス化し、それを新しいインスタンスAnnoTableModelに渡し、このインスタンスをmyテーブルに設定してからfireTableDataChanged()に設定する必要がありました。

EDIT IV:いいえ、結局のところ、fireTableDataChanged()(EDIT IIIで使用)は不要です。私はまだ新しいオブジェクトを作成するのではなく、むしろそれを使用したいと思っています。私は新しい質問をするべきだと思う...ありがとう!

AAViewのこのメソッドは、JTableに拡張されたオブジェクトを作成し、JScrollPaneなどに配置する必要があります(後者は機能します)。

private JPanel createAnnoTablePanel() { 
    annoTablePanel = new JPanel(); 
    annoTable = new AnnoTable(aameth); 
    setAnnoTable(annoTable); 
    JScrollPane scrollPane = new JScrollPane(getAnnoTable()); 
    annoTablePanel.add(scrollPane); 
    return annoTablePanel; 
} 

はここでクラスAnnoTable(​​は、データモデルにアクセスするには、ビジネス・ロジックを含むインスタンスオブジェクトで正常に動作します)です。

public class AnnoTable extends JTable implements TableModelListener 
{ 

    public AnnoTable(AAMethods aameth) 
    { 

    int tokenCount = aameth.getTokenCount(); 

    AnnoData annoData = new AnnoData(aameth); // cf. below, AnnoData is a Vector(Vector<Object>,String[]) 

    TableModel tableModel = new AnnoTableModel(annoData.getAnnoData(), 
    // AnnoTableModel extends AbstractTableModel(Vector, String[]) 
    annoData.getColTitles()); 
    setModel(tableModel); 
    getModel().addTableModelListener(this); 
    TableModelEvent tme = new TableModelEvent(tableModel); 
    this.tableChanged(tme); 
    setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    setCellSelectionEnabled(true); 
    getColumnModel().getSelectionModel().addListSelectionListener(new AnnoTableSelectionListener(this)); 
    setPreferredScrollableViewportSize(this.getPreferredSize()); 

    } 

    public void tableChanged(TableModelEvent e) { 
    int row = e.getFirstRow(); 
    int column = e.getColumn(); 
    AbstractTableModel model = (AbstractTableModel)e.getSource(); 
    String columnName = model.getColumnName(column); 
    Object data = model.getValueAt(row, column); // This is where the exception is thrown! 
    } 
} 

あなたは(3 Vector<Object>と列のタイトルのString[]を含むVectorを構築)またはAnnoData(かなり一般的AbstractTableModelの拡張である)AnnoTableModel()のソースコードが必要な場合は、私に知らせてください。

ここにスタックトレースがあります。これは本当にスレッドの問題がある可能性があります私が学んだことからなる

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 
at java.util.Vector.elementAt(Unknown Source) 
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source) 
at package.AnnoTable.tableChanged(AnnoTable.java:52) 
at javax.swing.JTable.setModel(Unknown Source) 
at javax.swing.JTable.<init>(Unknown Source) 
at javax.swing.JTable.<init>(Unknown Source) 
at package.AnnoTable.<init>(AnnoTable.java:25) 
at package.AAView.createAnnoTablePanel(AAView.java:464) 
at package.AAView.createNorthPanel(AAView.java:455) 
at package.AAView.displayAndAnnotate(AAView.java:444) 
at package.AAView.loadProject(AAView.java:333) 
at package.AAView.actionPerformed(AAView.java:286) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.AbstractButton.doClick(Unknown Source) 
at javax.swing.AbstractButton.doClick(Unknown Source) 
at javax.swing.plaf.basic.BasicMenuItemUI$Actions.actionPerformed(Unknown Source) 
at javax.swing.SwingUtilities.notifyAction(Unknown Source) 
at javax.swing.JComponent.processKeyBinding(Unknown Source) 
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source) 
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source) 
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source) 
at javax.swing.JMenuBar.processKeyBinding(Unknown Source) 
at javax.swing.KeyboardManager.fireBinding(Unknown Source) 
at javax.swing.KeyboardManager.fireKeyboardAction(Unknown Source) 
at javax.swing.JComponent.processKeyBindingsForAllComponents(Unknown Source) 
at javax.swing.JComponent.processKeyBindings(Unknown Source) 
at javax.swing.JComponent.processKeyEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(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.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$2.run(Unknown Source) 
at java.awt.EventQueue$2.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) 

私はそこでEDTを見ることができます。しかし、私はどこで新しいThreadを始めるべきかを知る方法を知らない(またはnew Runnable()を呼び出す)。

AnnoTableJPanelではなくJTableに変更すると例外が表示され始めました。もともと私はAnnoTableを持っていただけでなく、スクロールペインにラップして、これを新しいJPanelに追加しました。しかし、AAView(これもsetAnnoTable()メソッドがあります)を知っていたクラスのfireTableDataChangedに送信したかったので、正しい方法でやりたかったのですが、それ以前はうまくいきました。マーフィーの法則?

答えて

4

rowIndexが-1(== TableModelEvent.HEADER_ROW)は、モデルの構造が完全に変更されたことを示します。このようなイベントは、setModelのJTableによって内部的に起動されます。リスナーのtableChangedで期待される型/値を完全に理解するには、TableModelEventのAPIドキュメントを読んでください。

ところで、@AKJは正しいです。テーブルコードでTableModelEventsを起動する必要はありません。 モデルを適切にイベントを発生させる

+0

エクセレントキャッチ+1 – mKorbel

+0

@kleopatra:ありがとう。もちろん私の場合、 'setModel()'は受け取っていないパラメータを受け取ることを期待していたハードコードされた 'tableChanged()'(cf. EDIT II)を呼び出します。私は方法を削除しました。この表は正しく表示されるようになりましたが、 'annoData'で何かが変更されたときには(' AbstractTableModel aaView.getAnnoTable()。getModel())。fireTableDataChanged() ' )、テーブルはまだ更新されません...おそらく、それは新しいクエリで尋ねられるべきです、誰かがここに誰かが素早い答えを持っていなければ:)。ありがとうございます! –

+1

_do not_モデルの外部のコードからモデルのfireXXメソッドのいずれかを呼び出します。代わりに_model_を実装して、何かが変更されたときに_model_を実装してください。 – kleopatra

2

これは、行または列として-1を渡すことを意味します。これは許可されません - 正しい値を渡すことを確認してください。

2

私はあなたの問題はここにある感情を持っている:あなたはrowcolumn値を指定していない

TableModelEvent tme = new TableModelEvent(tableModel);  
this.tableChanged(tme); 
-> 
    int column = e.getColumn();  
    AbstractTableModel model = (AbstractTableModel)e.getSource();  
    String columnName = model.getColumnName(column); 

ので、getColumn()getRow()呼び出しは-1を返します、あなたはその後、getValueAt()に渡していました。

TableModelEventのコンストラクタを見てみてください。これらの行/列の値を指定するオプションがあります。

+0

間違っている - 上の2行は例外とは無関係です(stacktrace :-)を参照してください。それ以外は、リスナーコードは '特別な値'(HEADER_ROW、ALL_COLUMNS)行/列インデックス – kleopatra

2
TableModelEvent tme = new TableModelEvent(tableModel); 
this.tableChanged(tme); 

私はこの呼び出しの必要はありません。他のポスターが指摘するように、これがあなたの問題の原因です。

テーブルモデルを正しく実装している場合は、テーブルモデルを更新するたびにjtableは自動的に通知を受け取るため、tableChanged()メソッドも記述する必要はありません。だからなぜtableChanged()を明示的に呼び出す必要があるのか​​分からない。

テーブルを更新する場合は、モデルを更新するだけです。一見したところで、スレッドに関する問題はないようです。

0

あなたのAnnoTableコンストラクタは、不完全に構成された "this"オブジェクトへの参照をリークしています。また、コンストラクタからのListenerの登録は安全ではありません。 enter link description here

コンストラクタで可能な限り少ない作業量でオブジェクトを構築し、完全に構築されたオブジェクトを操作します。リスナを追加し、モデルを調整し、fireEventsなど...

関連する問題