私の問題を解決できるかのように見えていたスレッドをすべて読んだが、ここですべての答えを読んだが、私はまだウィット終わり。私は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()
を呼び出す)。
AnnoTable
をJPanel
ではなくJTable
に変更すると例外が表示され始めました。もともと私はAnnoTable
を持っていただけでなく、スクロールペインにラップして、これを新しいJPanel
に追加しました。しかし、AAView
(これもsetAnnoTable()
メソッドがあります)を知っていたクラスのfireTableDataChanged
に送信したかったので、正しい方法でやりたかったのですが、それ以前はうまくいきました。マーフィーの法則?
エクセレントキャッチ+1 – mKorbel
@kleopatra:ありがとう。もちろん私の場合、 'setModel()'は受け取っていないパラメータを受け取ることを期待していたハードコードされた 'tableChanged()'(cf. EDIT II)を呼び出します。私は方法を削除しました。この表は正しく表示されるようになりましたが、 'annoData'で何かが変更されたときには(' AbstractTableModel aaView.getAnnoTable()。getModel())。fireTableDataChanged() ' )、テーブルはまだ更新されません...おそらく、それは新しいクエリで尋ねられるべきです、誰かがここに誰かが素早い答えを持っていなければ:)。ありがとうございます! –
_do not_モデルの外部のコードからモデルのfireXXメソッドのいずれかを呼び出します。代わりに_model_を実装して、何かが変更されたときに_model_を実装してください。 – kleopatra