teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

誤記訂正

2017/07/06 02:03

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -9,6 +9,6 @@
9
9
  > javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648)
10
10
  at パッケージ名.クラス名.mouseClicked(クラス名.java:496)
11
11
 
12
- 「行が選択された際の振る舞い」をMouseListener(MouseClicked)で行おうとしているように見えます。何に対してのMouseClickedなのか、そのハンドラーで「選択状態でないにもかかわらずなぜTableModel#getValueAtを呼び出そうとしているのかコードがないので不明ですが、やはりそのあたりに問題があるように思えます。
12
+ 「行が選択された際の振る舞い」をMouseListener(MouseClicked)で行おうとしているように見えます。何に対してのMouseClickedなのか、そのハンドラーで「選択状態でないにもかかわらずなぜTableModel#getValueAtを呼び出そうとしているのかコードがないので不明ですが、やはりそのあたりに問題があるように思えます。
13
13
 
14
14
  ところで、選択状態の変化を捉える目的ならMouseClickedではなくListSelectionListenerを使うべきと思います。

2

訂正

2017/07/06 02:03

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,14 @@
1
1
  Model全体を置き換えるのではなくModelの変更(追加・削除など)であれば、元の選択行を削除しない限り、「選択していた行がModelの変更前後でかわらないように自動的に選択位置が補正される」というのがJTable(あるいはJTableのListSelectionModel)の振舞いと思います。一方Model全体を設定しなおした場合、それ以前に選択していた行は無効になると思います。「以前に選択していた行」と「新たに設定されたモデルの中の同じインデックスのレコード」には何の関係もないと解釈するからだと思います。またその解釈は自分には自然に思えます。
2
2
 
3
- もしModel全体を置き換え、かつユーザー操作なしに最初から特定の行を選択状態にしたいなら、アプリケーション固有の判断に従って「新たに設定したModelのどの行を選択状態にしたいのか」をJTableへ教えてやる必要があると思います。具体的にはModelを設定した直後にJTableのListSelectionModelオブジェクトに対してsetSelectionIntervalメソッドなどを用いればよいでしょう。
3
+ もしModel全体を置き換え、かつユーザー操作なしに最初から特定の行を選択状態にしたいなら、アプリケーション固有の判断に従って「新たに設定したModelのどの行を選択状態にしたいのか」をJTableへ教えてやる必要があると思います。具体的にはModelを設定した直後にJTableのListSelectionModelオブジェクトに対してsetSelectionIntervalメソッドなどを用いればよいでしょう。
4
+
5
+ ---
6
+
7
+ 訂正:上記回答は質問者さんの問題とはずれた内容だったようです。追加された情報に基づき改めてコメントします。
8
+
9
+ > javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648)
10
+ at パッケージ名.クラス名.mouseClicked(クラス名.java:496)
11
+
12
+ 「行が選択された際の振る舞い」をMouseListener(MouseClicked)で行おうとしているように見えます。何に対してのMouseClickedなのか、そのハンドラーで「選択状態でないにもかかわらずなぜTableModel#getValueAtを呼び出そうとしているのか、コードがないので不明ですが、やはりそのあたりに問題があるように思えます。
13
+
14
+ ところで、選択状態の変化を捉える目的ならMouseClickedではなくListSelectionListenerを使うべきと思います。

1

誤記訂正

2017/07/05 09:39

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,3 +1,3 @@
1
- Model全体を置き換えるのではなくModelの変更(追加・削除など)であれば、元の選択行を削除しない限り、「選択していた行がModelの変更前後でかわらないように自動的に選択位置が補正される」というのがJTable(あるいはJTableのListSelectionModel)振舞と思います。一方Model全体を設定しなおした場合、それ以前に選択していた行は無効になると思います。「以前に選択していた行」と「新たに設定されたモデルの中の同じインデックスのレコード」には何の関係もないと解釈するからだと思います。またその解釈は自分には自然に思えます。
1
+ Model全体を置き換えるのではなくModelの変更(追加・削除など)であれば、元の選択行を削除しない限り、「選択していた行がModelの変更前後でかわらないように自動的に選択位置が補正される」というのがJTable(あるいはJTableのListSelectionModel)振舞と思います。一方Model全体を設定しなおした場合、それ以前に選択していた行は無効になると思います。「以前に選択していた行」と「新たに設定されたモデルの中の同じインデックスのレコード」には何の関係もないと解釈するからだと思います。またその解釈は自分には自然に思えます。
2
2
 
3
3
  もしModel全体を置き換え、かつユーザー操作なしに最初から特定の行を選択状態にしたいなら、アプリケーション固有の判断に従って「新たに設定したModelのどの行を選択状態にしたいのか」をJTableへ教えてやる必要があると思います。具体的にはModelを設定した直後にJTableのListSelectionModelオブジェクトに対してsetSelectionIntervalメソッドなどを用いればよいでしょう。