- - PR -
Ctrlキーを使わずにJTableを複数選択したい・・・
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-01-28 12:51
はじめまして。サラリーマンと申します。
現在swingで開発をしているのですが、Ctrlキーを使わずにテーブル を複数選択するように言われました。 @1行目を選択 A3行目を選択 B5行目を選択 1行目・3行目・5行目と選択状態にしたいのですが・・・。 addRowSelectionInterval()を使っているのですがうまくいきません。 納期を3日も過ぎているのでお心当たりの在る方は教えて頂けますか? | ||||
|
投稿日時: 2004-01-28 14:24
リスナでマウスなどのイベントを拾って、addColumnSelectionInterval() や addRowSelectionInterval() を駆使すればいいんじゃないかと思いますが、ダメだったのでしょうね。
どういうプログラムを書いて、それがどういう挙動をするから望みのものじゃないんだ、ということがさっぱりわからないので、これ以上はお答えできません。 The Java Tutorial の How to Use Tables とその周辺は ** 当然 ** 読まれましたよね ? http://java.sun.com/docs/books/tutorial/uiswing/components/table.html | ||||
|
投稿日時: 2004-01-28 15:12
びしばしさん早速のお返事ありがとうございます。
以下のようなプログラムなのですが・・・ public class MainFrame extends JFrame implements ListSelectionListener { ListSelectionModel selectionModel = new DefaultListSelectionModel(); TableModel model = new AbstractTableModel(); JTable table = new JTable(model); private void jbInit() throws Exception { ・ ・ ・ selectionModel.addListSelectionListener(this); lefttable.setSelectionModel(selectionModel); lefttable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); lefttable.setShowHorizontalLines(true); lefttable.setRowSelectionAllowed(true); ・ ・ ・ } public void valueChanged(ListSelectionEvent e) { if ( e.getValueIsAdjusting() ) { return; } int row = selectionModel.getMaxSelectionIndex(); selectionModel = (DefaultListSelectionModel)e.getSource(); selectionModel.setSelectionMode(selectionModel.MULTIPLE_INTERVAL_SELECTION); selectionModel.addSelectionInterval(row,row); } ] 返信いただければ幸いです。 宜しくお願いします。 | ||||
|
投稿日時: 2004-01-28 15:31
横から失礼します。
<ゴミ> valueChanged は MainFrame に実装されているように見えますが、 JTable の選択項目が変更されたときに呼ばれるのは JTable の valueChanged で、MainFrame の valueChanged ではありません。 このやり方でやるのなら、JTable を継承した新しいクラスを作成し、 JTable の valueChanged をオーバーライドする必要があります。 </ごみ> # 個人的には、専用の ListSelectionModel を作成した方がいいかと # 思います。 ## 以下、追記 あううう。勘違いしてました。ListSelectionListener を実装してますね。 お詫びに、ListSelectionModel を実装した場合の解を。 table に ListSelectionModel を設定する箇所を以下のようにしてください。 table.setSelectionModel(new DefaultListSelectionModel(){ public void setSelectionInterval(int index0,int index1){ if (index0 == index1 && super.isSelectedIndex(index0)){ super.removeSelectionInterval(index0,index1); return; } super.addSelectionInterval(index0,index1); } }); [ メッセージ編集済み 編集者: 顔爺 編集日時 2004-01-28 15:41 ] | ||||
|
投稿日時: 2004-01-28 15:46
顔爺さんありがとうございます。
理解力が無くてもうしわけないのですが、こういう事でしょうか? selectionModel.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if ( e.getValueIsAdjusting() ) { return; } }); 専用の ListSelectionModel を作成をしているつもりなのですが、 専用の ListSelectionModel を何処に作成すればいいか教えて頂けますか? 宜しくお願いします。 | ||||
|
投稿日時: 2004-01-28 16:03
レスがずれて申し訳ございません。
顔爺さんありがとうございます!!! 出来ました!!! 本当にありがとうございました!! | ||||
|
投稿日時: 2004-01-28 16:08
説明を書いてる途中に終わっちゃったようですが、のりかかった船ですので....
ListSelectionModel はどの行が選択されているかを維持しています。 addSelectionInterval は、指定した範囲の行が選択に追加されたときに呼ばれます。 (他の行の選択は元のままです)。 setSelectionInterval は、指定した範囲の行が選択されたときに呼ばれます。 (他の行の選択は解除されます)。 removeSelectionInterval は、指定した範囲の行が選択から除去されたときに呼ばれます。 上記の3メソッドのいずれかが呼ばれた場合、選択肢が更新されたということで ListSelectionLister に通知されます。 通知された先の JTable では、ListSelectionModel の isSelectedIndex を参照し、 指定された行が選択状態か否かを判断します。 問題なのは setSelectionInterval 時、他の行の選択が解除されることですので、 setSelectionInterval の結果が addSelectionInterval と同じになる ListSelectionModel を作成すればいいわけです。 ListSelectionModel をすべて実装するのは大変なので、DefaultListSelectionModel を 継承し、少しいじります。 public void setSelectionInterval(int index0,int index1){ // 選択 = (DefaultListSelectionModel の)追加 super.addSelectionInterval(index0,index1); } しかし、これだと一度選択した行は二度と選択解除できなくなるので、単一の選択行を クリックした場合のみ選択を解除するようにします。 if (index0 == index1 && super.isSelectedIndex(index0)){ super.removeSelectionInterval(index0,index1); return; } | ||||
|
投稿日時: 2004-01-28 16:21
顔爺さん本当に丁寧な解答ありがとうございました!!!
また、掲示板で私を見かけたら宜しくお願いします!! | ||||
