- PR -

JTableのvalueChanged()とメッセージボックスで変な動き

1
投稿者投稿内容
ふく
常連さん
会議室デビュー日: 2005/11/15
投稿数: 25
投稿日時: 2006-05-30 14:37
お世話になっております、ふくです。

掲題の件で、どなたかご教授ください。

環境
OS:Windows2000
JDK:1.4.2_10

現象:
まず、JTable#valueChanged()の振る舞いは
1.新しい行がクリックで選択された場合、2回呼び出される
2.同じ行の別セルをクリックしても同メソッドは呼び出されない
と、Javaのテキストに載っていました。
実際に試してもこの通りでした。

しかし、valueChanged()の中で、メッセージボックスを呼び出すようにすると
振る舞いが変わってしまいました。
1.新しい行がクリックで選択された場合、1回しか呼び出されない
2.1回だけ、同じ行の別セルをクリックすると呼び出されてしまう。

とりあえず、1回しか呼び出されない場合は問題はないのですが
同じ行の別セルをクリックした場合でも呼び出されると困ってしまいます。

何か解決方法がないか、どなたかご教授くださいませんでしょうか?
宜しくお願い致します。

以下、テーブルのソースを載せておきます。

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.event.ListSelectionEvent;

public class TestTable extends JTable
{

DefaultTableModel dtm = null;

// コンストラクタ
public TestTable( int iRow, int iColumn)
{
super( iRow, iColumn );
// 初期処理
init(iRow, iColumn );
}
// 初期処理
public void init( int iRow, int iColumn)
{
// TableModelのセット
dtm = new DefaultTableModel(iRow, iColumn );
this.setModel( dtm );
}

// valueChanged
public void valueChanged(ListSelectionEvent lse)
{
String strMsg = new String();

strMsg = "alert";

JOptionPane.showMessageDialog(null, strMsg, strMsg, JOptionPane.ERROR_MESSAGE);

System.out.println("valueChangedが呼ばれた");

super.valueChanged(lse);
}
}

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-05-31 12:12
あまりたいした回答ではないのですが、
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/swing/JTable.html#valueChanged(javax.swing.event.ListSelectionEvent)
には、
引用:

アプリケーションコードはこれらのメソッドを明示的には使用しません。これらのメソッドは JTable が内部的に使用します。


と書かれていますので、valueChanged をオーバーライドすることは推奨されていないと思います。もっとも、私も以前 valueChanged をオーバーライドしたことはあります。JTable のソースコードを見ても valueChanged をいじってもさほどの害はなさそうな感じもしました。

目的が良く分からないのですが、クリック(による選択状態の変更)によるイベントを取得されたいのならば ListSelection とか CellEditor 関連を使ってやったほうが良いのではないでしょうか?

#以下、あとで追加。
javadoc の意味は、メソッドを呼ぶな、ということを言っているだけであり、オーバーライドするな、ということではないみたいですね。ただ、JTable はゴチャゴチャの作りになっているのであまり手を入れたくない、というのが率直な感想です。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

[ メッセージ編集済み 編集者: unibon 編集日時 2006-05-31 12:16 ]
ふく
常連さん
会議室デビュー日: 2005/11/15
投稿数: 25
投稿日時: 2006-06-02 20:31
unibonさん

お返事ありがとうございます。m(__)m

目的は、行が変更された場合にエラーチェックを行い、
エラーであればメッセージを、無ければ更新処理を行いたいということです。
ですので、列の移動で処理が走ってしまうと困ってしまいます。

それと、valueChangedとListSelectionって違うのでしょうか?
valueChangedの説明を見た限りでは、このメソッドがListSelectionと等価な気がしたんですが・・・

>ただ、JTable はゴチャゴチャの作りになっているのであまり手を入れたくない、というのが率直な感想です。
↑これ大賛成です。
JTableは汎用的すぎて、もう何がなんだかわからない状態に度々なります。。
1

スキルアップ/キャリアアップ(JOB@IT)