- - PR -
ListSelectionModelについて
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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); ・ ・ ・ | ||||
|
投稿日時: 2004-05-27 13:14
Ad Hoc な対応ですが...
削除処理開始時に片方の JTable から ListSelectionModel を 除去すればいいと思います。
# 別の話ですが、この場合 TableModel は1つでもいいような.... | ||||
|
投稿日時: 2004-05-27 16:33
顔爺さん、早速のご返答ありがとうございました^^
同機がとれました! できればもうひとつお答え頂きたいのですが、 TableModelを1つにした場合、レフトテーブルだけが カラムヘッダしか表示されません^^; もしお答え頂ければ幸いです。 よろしくお願いします。 | ||||
|
投稿日時: 2004-05-28 18:07
たいした意味はないのですが....
今回の例で言うのなら 'A' から 'H' のすべてのカラムを保持する TableModel を 用意し、左の JTable には 'A'/'B' 、右の JTable には 'C' 〜 'H' を表示すれば いいのでは、と思っただけです。 # JTable 自体は View(+Controller) なので、JTable 自体からカラムを除去しても # JTable が参照する TableModel(Model) には影響を与えません。 | ||||
1
