- PR -

Ctrlキーを使わずにJTableを複数選択したい・・・

投稿者投稿内容
サラリーマン
常連さん
会議室デビュー日: 2004/01/28
投稿数: 27
投稿日時: 2004-01-28 12:51
はじめまして。サラリーマンと申します。

現在swingで開発をしているのですが、Ctrlキーを使わずにテーブル
を複数選択するように言われました。
@1行目を選択
A3行目を選択
B5行目を選択

1行目・3行目・5行目と選択状態にしたいのですが・・・。
addRowSelectionInterval()を使っているのですがうまくいきません。
納期を3日も過ぎているのでお心当たりの在る方は教えて頂けますか?
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 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
投稿数: 27
投稿日時: 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);
}
]

返信いただければ幸いです。
宜しくお願いします。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-01-28 15:31
横から失礼します。

引用:

サラリーマンさんの書き込み (2004-01-28 15:12) より:
びしばしさん早速のお返事ありがとうございます。
以下のようなプログラムなのですが・・・

public class MainFrame extends JFrame implements ListSelectionListener {

(略)

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);
}
]

返信いただければ幸いです。
宜しくお願いします。



<ゴミ>
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
投稿数: 27
投稿日時: 2004-01-28 15:46
顔爺さんありがとうございます。

理解力が無くてもうしわけないのですが、こういう事でしょうか?

selectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if ( e.getValueIsAdjusting() ) {
return;
}
});

専用の ListSelectionModel を作成をしているつもりなのですが、
専用の ListSelectionModel を何処に作成すればいいか教えて頂けますか?
宜しくお願いします。
サラリーマン
常連さん
会議室デビュー日: 2004/01/28
投稿数: 27
投稿日時: 2004-01-28 16:03
レスがずれて申し訳ございません。

顔爺さんありがとうございます!!!
出来ました!!!
本当にありがとうございました!!
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 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
投稿数: 27
投稿日時: 2004-01-28 16:21
顔爺さん本当に丁寧な解答ありがとうございました!!!

また、掲示板で私を見かけたら宜しくお願いします!!

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