- PR -

ListSelectionModelについて

1
投稿者投稿内容
サラリーマン
常連さん
会議室デビュー日: 2004/01/28
投稿数: 27
投稿日時: 2004-05-27 11:14
ListSelectionModelについてお聞きしたいのですが、
JTableを2つ使用し、1つのテーブルのように見せています。

下記の用にしてます^^;
@カラム名、A・Bをレフトテーブルとする。
Aカラム名、C〜Hをライトテーブルとする。
Bデフォルト表示は、A・B・C・Dとする。
Cライトテーブルに水平スクロールバーを設定する。
D一方を行選択すると、もう一方の同一行も選択状態にする。

※1 上記Dを反映させる為、一つのListSelectionModelを
   レフト及びライトに使用する。(同機をとる為)

ここからが問題なのですが、2・3・4行目を行選択した
状態で、レフト及びライトの1行目を削除すると、選択状態
が2・3行目になってしまい、4行目の選択状態が非選択状態
になってしまいます。※1を使用している為とレフト及びライト
を削除している為に、ListSelectionModelに2回通知していると
思います。何か打開策はないでしょうか?

よろしくお願いします。

以下、サンプルソース





// セレクションモデル
ListSelectionModel selectionModel = new ListSelectionModel();
selectionModel.addListSelectionListener(this);

// レフトテーブル
lefttable_ = new JTable(leftmodel_);
lefttable_.getTableHeader().setReorderingAllowed(false);
lefttable_.getTableHeader().setResizingAllowed(false);
lefttable_.setForeground(Color.WHITE);
lefttable_.setBackground(new Color(0, 0, 80));
lefttable_.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
lefttable_.setDefaultRenderer(Object.class, new TableCellRenderer());
lefttable_.setSelectionModel(selectionModel);

// ライトテーブル
righttable_ = new JTable(rightmodel_);
righttable_.getTableHeader().setReorderingAllowed(false);
righttable_.getTableHeader().setResizingAllowed(false);
righttable_.setForeground(Color.WHITE);
righttable_.setBackground(new Color(0, 0, 80));
righttable_.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
righttable_.setDefaultRenderer(Object.class, new TableCellRenderer());
righttable_.setSelectionModel(selectionModel);

// ビューポート
viewport = new JViewport();
viewport.setPreferredSize(new Dimension(245, 320)); //+20
viewport.setView(lefttable_);

// スクロールペイン
scrPane_ = new JScrollPane();
scrPane_.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrPane_.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrPane_.setPreferredSize(new Dimension(820, 354));//820,180
scrPane_.setBounds(new Rectangle(15, 5, 931, 354));//15,5,931,353
scrPane_.getViewport().add(righttable_, null);
scrPane_.setRowHeaderView(viewport);
scrPane_.setCorner(JScrollPane.UPPER_LEFT_CORNER, lefttable_.getTableHeader());





// 選択行削除



// 多分ここで1回目をセレクションに通知
leftmodel_.removeRow(row);
// 多分ここで2回をセレクションに通知
rightmodel_.removeRow(row);



顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-05-27 13:14
Ad Hoc な対応ですが...

削除処理開始時に片方の JTable から ListSelectionModel を
除去すればいいと思います。

引用:

DefaultListSelectionModel dummy = new DefaultListSelectionModel();

// 右テーブルの selectionModel を無効にする
righttable_.setListSelectionModel(dummy);

leftmodel_.removeRow(row);
rightmodel_.removeRow(row);

// selectionModel を元に戻す
righttable_.setListSelectionModel(selectionModel);



# 別の話ですが、この場合 TableModel は1つでもいいような....
サラリーマン
常連さん
会議室デビュー日: 2004/01/28
投稿数: 27
投稿日時: 2004-05-27 16:33
顔爺さん、早速のご返答ありがとうございました^^
同機がとれました!
できればもうひとつお答え頂きたいのですが、
TableModelを1つにした場合、レフトテーブルだけが
カラムヘッダしか表示されません^^;
もしお答え頂ければ幸いです。
よろしくお願いします。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-05-28 18:07
たいした意味はないのですが....

今回の例で言うのなら 'A' から 'H' のすべてのカラムを保持する TableModel を
用意し、左の JTable には 'A'/'B' 、右の JTable には 'C' 〜 'H' を表示すれば
いいのでは、と思っただけです。

# JTable 自体は View(+Controller) なので、JTable 自体からカラムを除去しても
# JTable が参照する TableModel(Model) には影響を与えません。
1

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