• ベストアンサー

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を上手に使うともっと良い方法があるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • JTableのイベント取得方法

    お世話になります JTableにDBからの検索結果を表示させて、そのセルを編集したときに編集したセルに対してアップデート等の処理を行いたいのですが、セルが編集されたときのイベントを取得したいのですがうまくいきません。 具体的なソース等のアドバイスよろしくお願いします。 ---ソース--- TableEditListener lisner = new TableEditListener() tableModel = new AbstractTableModel(vecResult,clmName); tableModel.addTableModelListener(lisner); table = new JTable(tableModel); 内部クラス class TableEditListener implements javax.swing.event.TableModelListener{  public TableEditListener(){ } public void tableChanged(TableModelEvent e){ System.out.println("セルの編集をしました。"); } } 現在以上のようなソースになっています。 よろしくお願いします。

    • ベストアンサー
    • Java
  • SwingでJtableのヘッダ行が表示されません

    SwingでJtableのヘッダ行が表示されません 解決方法とどうして表示されなかったのか理由もできればお願いします。 import java.util.Vector; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class Table_Calendar extends JFrame{ Vector<String>[] data = new Vector[3]; public static void main(String args[]){ new Table_Calendar(); } public Table_Calendar(){ super(); // ウィンドウサイズ this.setSize(800, 600); // レイアウト this.setLayout(null); // ウィンドウクローズ時の処理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // セルのデータ作成 for (int i = 0; i < 3; i++) { data[i] = new Vector<String>(); } // data[0]に名前、data[1]に住所、data[2]に電話番号 data[0].addElement("鈴木一郎"); data[1].addElement("東京都"); data[2].addElement("xxxxxxxxxx"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 1; } // 列数 public int getColumnCount() { return 3; } // row行column列の値をセット public Object getValueAt(int row, int column) { return data[column].elementAt(row); } // タイトル部の値をセット public String getColumnName(int column) { switch (column) { case 0: return "名前"; case 1: return "住所"; case 2: return "電話番号"; } return ""; } }; JTable table = new JTable(tableModel); table.setLocation(10, 20); table.setSize(600,500); JPanel panel2 = new JPanel(); panel2.setLayout(null); panel2.add(table); /*setBounds(int x,int y,int width,int height)*/ panel2.setBounds(10, 10, 700,700); this.add(panel2); this.setVisible(true); } }

    • ベストアンサー
    • Java
  • スーパークラスのインスタンスをサブクラスにアップキャスト

    ↑したい場合はどうしたらいいでしょうか。 データ構造体(beans)なのでスーパークラスのgetterとsetterを 利用してサブクラスに再構築する方法が考えられますが どうも腑に落ちないので質問してみました。 サブクラス側で継承をやめて集約にするにしても getterとsetterをまた書くの?って感じでわずらわしいです。 (jsp:getPropertyを利用するかもしれませんしね) さらにスーパークラスのメソッド全てをインタフェース化してサブクラスで実装とかしてたら具合が悪くなってきます。 この長年の疑問に終止符を打ってくれる方はいませんか?

    • ベストアンサー
    • Java
  • C++のfriend classについて

    C++のfriend classについて C++の初心者です。 C++でのfriend classは基本的に、全プロパティに対するsetter,getterを持たせて 集約、コンポジションにより代替が可能だと思うのですが、今勉強の為に読解して いるソースではsetter,getterの実装がなされているクラスの使用に対しても friend 宣言が多発していて中途半端なルールになっていると感じてしまいます。 friend 宣言によって別途実現可能になる事や、パフォーマンス的に有利(微々たる 物なはず)な事ってあるのでしょうか?

  • JTable ArrayList 表示されない

    度々質問させて頂いてます。 Jtableでファイルのリストを表示させたいのですが、アプリ外(Windowsのエクスプローラ)からのD&Dしてきたファイルを、最初に要素のない状態で定義したArrayList型の変数?にいれる(addする)ので、はじめはArrayList型変数には知らない(意味を持たない)値が入っているか、JTableが、表示する範囲の要素がなくて困ってしまっているはずです。たぶんそのせいでJTableに表示されないんだと思います。(妄想です) nullで初期化しようとも考えたのですがそうするとaddが使えなくなってしまい(nullが入っているところの後ろからaddされる)、同じ班の人が作ってくれたクラスを手直し?しなくてはなりません。 どうすればいいでしょう。 ちょっと日本語がイカれてますができれば助けて欲しいです。 補足ならいくらでもします。 //TableModelクラス public class TableModel extends AbstractTableModel{ public static DataList mainList = new DataList(); TableModel(){ } @Override public int getColumnCount() { return 4; } @Override public int getRowCount() { return 1; } @Override public String getValueAt(int row, int column) { String fileName = mainList.GetData(row).GetName(); String lastModifiedDate = mainList.GetData(row).GetDate().toString(); String filePath = mainList.GetData(row).GetPath(); switch(column){ case 0: return null; case 1: return fileName; case 2: return lastModifiedDate; case 3: return filePath; default: return null; } } public String getColumnName(int column){ switch(column){ case 0: return null; case 1: return "ファイル名"; case 2: return "更新日時"; case 3: return "パス"; default: return null; } } } //DataListクラス public class DataList{ List<FileData> dataList; public DataList(){ this.dataList = new ArrayList<FileData>(); } // 末尾にデータを追加 public void AddData(FileData fd){ this.dataList.add(fd); } } FileDataクラスは単純にファイル名、パス、更新日時(Date型)を持つクラスです rowが1なのはいろいろ試したからで、実際は30行くらい表示していたいです。

    • ベストアンサー
    • Java
  • SwingのJTableについて

    swingなのですが下記のプログラムで実現できない点があります。 1.isCellEditableメソッドを使ってセルを編集可能にしたのですが 編集した文字が消えてしまいます。 2.また、ボタンを配置してボタンを押下時に編集したセルの   行のデータをコンソールに表示したいのですがどうすればいいかわかりません。 3.画面レイアウトがsetLocation(x, y)した位置に表示されません。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class JTableSample4 implements ActionListener { static Vector<String>[] data = new Vector[3]; static JFrame frame; public static void main(String[] args) { frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); JPanel panel1 = new JPanel(); // セルのデータ作成 for (int i = 0; i < 3; i++) { data[i] = new Vector<String>(); } // data[0]に名前、data[1]に住所、data[2]に電話番号 data[0].addElement("鈴木一郎"); data[1].addElement("東京都"); data[2].addElement("xxxxxxxxxx"); data[0].addElement("佐藤花子"); data[1].addElement("千葉県"); data[2].addElement("yyyyyyyyyy"); data[0].addElement("田中浩二"); data[1].addElement("埼玉県"); data[2].addElement("zzzzzzzzzz"); data[0].addElement("小川伸介"); data[1].addElement("新潟県"); data[2].addElement("aaaaaaa"); data[0].addElement("佐藤和也"); data[1].addElement("群馬県"); data[2].addElement("bbbbbbb"); data[0].addElement("渡辺悟"); data[1].addElement("愛知県"); data[2].addElement("ccccccc"); data[0].addElement("橋本智也"); data[1].addElement("愛媛県"); data[2].addElement("ddddddd"); data[0].addElement("永井祐二"); data[1].addElement("栃木県"); data[2].addElement("eeeeeee"); data[0].addElement("細貝昭二"); data[1].addElement("福岡県"); data[2].addElement("fffffff"); data[0].addElement("堀野友光"); data[1].addElement("長野県"); data[2].addElement("gggggggg"); // テーブル作成 TableModel tableModel = new AbstractTableModel() { // 行数 public int getRowCount() { return 10; } // 列数 public int getColumnCount() { return 3; } // row行column列の値をセット public Object getValueAt(int row, int column) { return data[column].elementAt(row); } // タイトル部の値をセット public String getColumnName(int column) { switch (column) { case 0: return "名前"; case 1: return "住所"; case 2: return "電話番号"; } return ""; } /******************セルの編集 可/不可を操作するメソッド**********************/ public boolean isCellEditable(int rowIndex, int columnIndex) { /*0が1カラム目 1が2カラム目なのでこの場合電話番号だけ編集可*/ if (columnIndex == 0 || columnIndex ==1) { /*falseは編集不可*/ return false; } else /*trueは編集可*/ return true; } }; JLabel label = new JLabel("電話番号だけがセルを編集することができます"); label.setLocation(10, 10); label.setSize(300, 20); JButton button = new JButton("Click Me!"); button.setLocation(10, 400); button.setSize(20, 20); //button.addActionListener(); JTable table = new JTable(tableModel); JScrollPane scrollPane = new JScrollPane(table); scrollPane.setLocation(10, 40); scrollPane.setSize(750, 180); panel1.add(button); panel1.add(label); panel1.add(scrollPane); panel1.setBounds(10, 10, 800, 230); frame.add(panel1); frame.setSize(800, 600); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("test"); } }

    • ベストアンサー
    • Java
  • スクロール表示

    お願いします。 初めてswingに挑戦中なのですが・・・ tableをスクロール表示させたいのですがどうしてもできません。どうしたらよいでしょうか?教えてください import java.lang.*; import javax.swing.*; import javax.swing.table.*; import java.awt.*; public class SwingTableApp extends JFrame { public JTable table; public JLabel label; public SwingTableApp(String[][] data) { super("parallel Machine Scheduling"); setLocation(50,50); setSize(400,700); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(null); DefaultTableModel tableModel = new DefaultTableModel(); for(int k=0; k<data[0].length; k++){ tableModel.addColumn("TEST"); }//列の設定 for(int j=0; j<data.length; j++){ tableModel.addRow(data[j]); }//行の設定 table = new JTable(tableModel); table.setLocation(10,10); table.setSize(2000,200); getContentPane().add(table); label = new JLabel("目的関数"); label.setLocation(10,210); label.setSize(100,25); getContentPane().add(label); } }

    • ベストアンサー
    • Java
  • JTableにおけるTABイベント取得について

    現在JTableを勉強しているのですが、 JTalbeでセルにフォーカスがある場合普通「TABキー」を押したときはフォーカスは右に移動すると思います。(右端にに到達したときは一段下がって左端といったように) そのイベント(タブ移動)使ってTABでフォーカスが移ったCellを編集できるようにEditモードにしたいと考えています。現在JTABEを以下のように実装しています -------ソース------- resultTable = new ETable(vecResult,clmName); ListSelectionModel cellSelectionModel = resultTable.getSelectionModel(); cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); cellSelectionModel.addListSelectionListener(this); * 内部テーブルクラス class ETable extends JTable{ public ETable( Vector rowList, Vector clmnList ){ super(rowList,clmnList); DefaultTableColumnModel colModel = (DefaultTableColumnModel)getColumnModel(); //0番目のカラムを取得する for (int i=0;i<clmnList.size();i++){ TableColumn col0 = colModel.getColumn( i ); //0番目のカラムにMyCellEditorをセットする col0.setCellEditor( new MyCellEditor( new JTextField() ) ); } } } public void valueChanged(ListSelectionEvent e) {   //Cellの値が変わったときのイベント(APIによると…)   *実際はセルをクリックするたびに走ってしまう(不思議)  }   このソースに追加して実現することはできるでしょうか? よきアドバイスをよろしくお願いします。

  • List<DataClass>からデータ抽出

    javaでプログラミングを始めたのですが、人のプログラムを読んでいてわからない所があります。 まずデータクラスとして「GPSData」があり、これは2つの値のsetterとgetterを持っています。 public class GpsData { private float lat; private float lon; public float getLat() {return lat;} public void setLat(float lat) {this.id = lat;} public float getLon() {return lon;} public void setLon(float lon) {this.id = lon;} } GPSDaoというクラスがselectAllというメソッドを持っており、これはDBのGPSテーブルの値を取得し、List<GPSData>を返します。 以下のようにまずはlistをnewして、その中にselectAll()で取得したList<GPSData>を代入する所までは記述できたのですが、このあとどうしたらlistの中のデータをsetterとgetterで取り出せますか? GpsDao gdao = new GpsDao(); List<GpsData> list = gdao.selectAll(); 「list.」と書いても、「デフォルト・プロポーザルがありません」となってしまいます。

    • ベストアンサー
    • Java
  • データベース(テーブル情報)操作方法に関して

    まだJAVAを初めて1ヶ月ちょいの初心者です。ぜひ教えて頂きたいことがあります。 データベースのテーブル操作に関してなんですが、どうコーディングしたら効率のよいプログラムになるのか検討段階でつまずいています。 今考えているのが、スーパークラスにてテーブルの各カラム変数を宣言し、そのサブクラスにてテーブル操作毎のSQL発行(スーパークラスから継承した抽象メソッドを用いて)をしたほうがいいのかなと考えてます。 つまり・・・ ----<<super class(抽象クラス)>>----- public abstract class InfoTable { private String name; private int age; : public String getName() { return Staff_ID; } public String setName(String name){ this.name = name } //抽象クラス(SQLを発行しテーブルを操 //作する抽象メソッド) public abstract boolean exec(); } とし、サブクラスにて継承&実装すればよいのかと・・・。 実際にテーブルのカラムが多くなれば、setter・getterを多く繰り替えし処理をしなければならなくなり、それは大変だし、プログラム的にもよくないんじゃないかと考えています。実際にサブクラスはサーブレットからデータを取得してから処理を行う予定なので、Vectorを使えばいいのかなとは思いますが、どう使ったらよいのか検討がつきません。 長々と書いてしまい申し訳ございません。 どなたか良い知恵をお貸し下さい!

    • ベストアンサー
    • Java