Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTableで、異なる値を持てるコンボボックスを表示させる方法について

お世話になります。
JTableにコンボボックスを表示させる方法について教授ください。
特定列で、行ごとに別々の値をセットしたいのです。


以下のようなコードで、コンボボックスの表示は可能です。
-----------------------------------------------
JTable table = new JTable();
JComboBox cmb = new JComboBox();
cmb.addItem("AAA");
cmb.addItem("BBB");
DefaultCellEditor dce = new DefaultCellEditor(cmb);
table. getColumnModel().getColumn(1).setCellEditor(dce);
-----------------------------------------------

しかしこの方法だと、ColumnModelは列単位でしか取得できない為、
設定できるコンボボックスのオブジェクトも各行で1つとなり、行ごとに
異なった値を持つことができません。

よろしくお願いします。

13

回答

9030

閲覧

13件の回答

評価

0

DefaultCellEditor の派生クラスを作って
TableCellEditor#getTableCellEditorComponent
をオーバーライドする。

引数の row で行番号を判定して row 毎に
別の値をコンボボックスに設定して返す。
で、できませんか?

評価

0

回答、ありがとうございます。

追加で質問なのですが、
任意の値(コレクションなど)を後から渡して行ごとに設定することは可能でしょうか??

評価

0

TableCellEditor#getTableCellEditorComponent()の引数、
自分で確認してみた?

評価

0

ありがとうございます。

動かしてはみたのですが・・・
JTableから渡すということでしょうか??

評価

0

>動かしてはみたのですが・・・

具体的にどんなことやったの?

パテ太氏が書いてる「派生クラス作ってメソッドをオーバーライドする」の意味、
理解できてる?
     
TableCellEditor#getTableCellEditorComponent()の引数と返り値は確認した?

俺が書いてるのは、getTableCellEditorComponent()の引数には
rowもcolumnも含まれるから、
どのセルのリストボックスを返せばいいか、
判定するのに材料は不足していないでしょ、
って意味だ。

あと、CellEditorは、列や行にsetするんじゃなく、
JTableそのものにsetすればよい。

評価

0

継承して、オーバーライドしました。

何度もすみません。

実際に表示されている値は、setValueメソッドから渡されているようなのですが、後でコンボボックスをセットした場合はどのように表示させれば良いでしょうか?

評価

0

コンボボックスなんか、セットしなくていいです。
やってるんなら、そいつは取り消し。
TableCellEditor#getTableCellEditorComponent()がリストボックスを返すようにして、
そのリストボックスを使うことにすればよろしい。

セルから取ってくる方法もあるかもしれないけど、
俺なら必要無しと判断する。:-p

セルの見た目そのものも、コンポーネントにしたいの?
その場合はTableCellRendererを使う。
見りゃわかるが、同じような名称のメソッドがある。

評価

0

必要無しは言い過ぎかあ・・・。
俺がやったことがあるのは、チェックボックスだけだし。

評価

0

連投失礼します。m(_ _)m
コンボボックスとリストボックスが入り乱れている。
コンボボックスに統一させてください。

評価

0

遅れて申し訳ありません。
たくさん回答、ありがとうございます!!

見た目もコンボボックスっぽくしたいです。TableCellRendererを利用し、セルにドロップダウンボタンを表示させています。しかし、ドロップダウンから値を選択した後、セルの表示が空白のままになってしまいます。

TableCellEditorのコンストラクタには、コンボボックスのオブジェクトを引数にとるものが用意されています。コンストラクタに渡したコンボボックスの値が、選択時の値としてgetTableCellEditorComponentの引数_[value]に渡され、setValueメソッドでセルに表示させているようです。
しかし、継承したクラスの中で新しく生成したコンポーネント返すようにした場合、ドロップダウンから選択した値は[value]には渡されず、setValueメソッドも利用できません。

表示させる方法はあるのでしょうか??

評価

0

いや、回答数が多いのは、俺の脇が甘いだけのことで。(-.-;

閑話休題。

ああ、そういえばそうなるな。
俺のやり方では、EditorもRendererも上書きしているから、
値はコンボボックスが持っていて、
JTable上のセルは、明示的にフォローを入れない限りは、
無視することになってます。

さらに、特にRendererが上書きされている場合は、
個々のセルにひとつずつ、固有のコンボボックスが必要になるはず。

まとめると、俺のいってるやり方は、

・個々のセルごとにコンボボックスをひとつずつ用意する。
・EditorとRendererは、上記のコンボボックスを共有する。
・コンボボックスは、配列に格納しておく。
 2次元配列にするよりも、列(要素)ごとに1次元の配列を持つ方がいいんじゃないか。
 つか、他の人はどうやってるの?
・値は、コンボボックスが持つ。
 JTableのセルの値とは無視無視。

こんなところかな。

コンボボックスのactionPerform()に、
JTableのセルに値をセットするロジックを
書く方法もあるけど、その場合は値を2カ所に持つことになる。
JTableは、結果の読み出し専用にするとか、
依存関係に気をつける必要がある。

評価

0

ありがとうございます。

不良社員さんの紹介して下さった方法を参考に、もう少し検討してみます。

今の私のクラスからすると、コンボボックスのactionPerformでセルへの表示が実現できそうです。

完成したら報告させていただきます。

評価

0

むー、いろいろと憶測を交えて書くが。

今回は、Rendererを使うのはやめてはどうか。
まずは、Editorの使用について、ちゃんと動くように作るのを目的にする。

これだったら、
TableCellEditor#getTableCellEditorComponent()が
コンボボックスを返すときに、セルの値を取得して、
コンボボックスにセットする必要がある・・・はず。
なので、JTableの存在を意識しやすいんじゃないだろうか。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。