• ベストアンサー

JTableからのデータの取得

列数の多いテーブル (JTableの派生クラス) から ユーザー定義クラス (各プロパティにはsetterとgetterは実装済み) に 効率的にデータを取得する方法を教えて下さい。 データの取り込みはTableModelクラスを使って行う予定ですが 列数が多いため、列番号でIF分岐してsetterを呼ぶのは あまりに非効率な気がします。 どのように処理するのが良いのでしょうか? お知恵をおかしください。宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

>それは、引数で「名前」を渡してクラス内部で該当するプロパティを検索して >値を設定すると言う意味ですか? 「プロパティを検索して」というのが、どのようなものをイメージされているかわかりませんが、 ちょっとニュアンスが違う気がします。 たとえば、 ---------------------------------- public class XXXAdapter { XXX xxx; public XXXAdapter(XXX xxx){ this.xxx = xxx; } public vod setValueByName(String name, Object value){ if(name.equals("id")){ xxx.setId((String)value); } } } ---------------------------------- といった具合です。 最初の質問に 「列番号でIF分岐してsetterを呼ぶのはあまりに非効率な気がします。」 とありますが、それは仕方のないことです。 JAVAにはたまたまリフレクションと機構がありますが、他の言語ではそのような機構がないものも たくさんあります。 そのような言語で処理するには、このような方法しかないでしょう。 (そのため個人的にはリフレクションはあまり好きではありません) 「非効率」というのが、コードの作成のことか、処理スピードのことかどちらを指しているのかわかりませんが、処理スピードであれば、さほど問題にはならないはずです。 また、コード作成に関してでしたら、「そういうものだ」と思ってください。 大事なのは、名前と処理の結びつけを、1箇所集中管理すること、このユーティリティクラスを使う側から中身を隠蔽してしまうこと、プログラムの最初の作成時よりもメンテナンスを考えることです。

ken2r
質問者

お礼

ご回答有難うございます。 「「名前」でアクセスできる」の、意味が理解できました。 丁寧に説明していただき有難うございました。

その他の回答 (2)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

質問の意図が理解しきれていないのですが、TableModelのデータをユーザー定義クラスに設定する場合の話ですかね? ユーザー定義クラスに対し、「名前」でアクセスできるクラスを作るのがいいかと思います。 また、TableModelからデータを取得するのも名前を使ってアクセスしましょう。 列番号などでアクセスすると、変更に弱いプログラムとなりやすいので、個人的には好きではありません。 (ついでにリフレクションを使ってアクセスするのも、個人的には好きではありません) TableModel、ユーザー定義クラス双方とも名前でアクセスできるようになれば、 名前と行番号だけでTableModelからユーザー定義クラスへデータをセットできるメソッドも作れます。 あとはそのメソッドを使えば、すっきりとしたコードになるかと思います。

ken2r
質問者

お礼

ご回答有難うございます。 教えて頂いた「「名前」でアクセスできる」の、意味が分かりません。 それは、引数で「名前」を渡してクラス内部で該当するプロパティを検索して 値を設定すると言う意味ですか? リフレクション以外に、そのような方法があると言う意味でしょうか? もう少し具体的に教えて頂けると助かります。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

それを実現する ユーティリティクラスを作ってあげればいいのよ

ken2r
質問者

お礼

ご回答有難うございます。 ユーティリティクラスとは共通処理をstaticに集めたクラスと認識しています。 間違っていたらすみません。 現在、検討中の案なのですが、Javaのリフレクション機能(使ったことないです...) を使って、テーブルの各列にsetter名と類似したIDを付けてリフレクションでsetterをコールする。 この方法は正解でしょうか? それとも、JTableのTableModelを上手に使うともっと良い方法があるのでしょうか?