2

あたかも私の問題を解決できるかのように見えるすべてのスレッドを読み、ここにあるすべての回答も読みましたが、私はまだ機知に富んでいます. 例外がスローされる理由はわかりませんが、これはthreading. 含まれている場合は、 をどこに含めるべきか、またはを含めるnew Runnable()かどうかを教えてください。invokeLater()invokeAndWait()

例外につながるコードとスタックトレース (以下) を提供する間、しばらくお待ちください。

編集:が呼び出される直前sysoのセクションにいくつかの sが含まれていましたが、それらはコンソールに表示されません。したがって、アプリケーションがその時点に到達する前、つまり、から呼び出されたとき、またはデータとテーブル モデルがインスタンス化されるとき...AnnoTabletableChangedAAView

EDIT II:問題は上書きされたtableChanged方法でした。それは明らかに例外を発生させます。呼び出しも削除しましたtableChanged()(違いはありません)。AnnoDataここで、もう 1 つの問題があります。基になるデータ ( ) の変更によってテーブルが自動的に更新される仕組みを理解することです。これはおそらく別のクエリ (拡張された Google 検索の後) のためのものですが、このスレッドを読み続けるので、お気軽にこのスレッドに役立つコメントを投稿してください...すべての役立つコメントとヒントに感謝します!

編集 III:*問題を解決しました。から別のオブジェクトをインスタンス化しAnnoData、それを の新しいインスタンスに渡し、AnnoTableModelこのインスタンスをテーブルと THEN に設定する必要がありました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(aamethは、データ モデルにアクセスするためのビジネス ロジックを含むインスタンス オブジェクトであり、正常に動作します)。

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!
  }
}

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

これがスタックトレースです。

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拡張に変更したときにのみ表示され始めました。もともと、テーブルを作成するだけでなく、スクロール ペインでラップして、これを新しい .xml に追加していました。しかし、 (メソッドも備えている)しか知らないクラスからやりたかったので、以前はうまく機能していましたが、正しい方法でやりたかったのです。マーフィーの法則?JTableJPanelAnnoTableJPanelfireTableDataChangedAAViewsetAnnoTable()

4

5 に答える 5

5

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

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

于 2011-10-24T14:12:25.427 に答える
3

私はあなたの問題がここにあると感じています:

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

rowまたはcolumnの値を指定していないため、 getColumn()andgetRow()呼び出しは-1を返し、これをに渡しgetValueAt()ます。

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

于 2011-10-24T13:29:53.353 に答える
3

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

于 2011-10-24T13:10:41.870 に答える
3
TableModelEvent tme = new TableModelEvent(tableModel);
this.tableChanged(tme);

この電話の必要はないと思います。他のポスターが指摘しているように、これが問題の原因です。

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

テーブルを更新したいときはいつでも、モデルを更新するだけです。また、一見すると、スレッド化の問題はないように見えます。

于 2011-10-24T14:01:11.923 に答える