- 締切済み
JTableの表からデータ保存等について
JTableを使って表計算出来るアプリを作りたいなと思ってますが 分からない事だらけで・・・ まずはリファレンスなるものに慣れるのが先決かも判りませんが。 やりたい事は ・セルを使って四則計算がしたい。 ・入力したデータを保存したい。 ネットで検索したりここの過去ログやを見るとどうやら XMLを使うのが手軽みたいですがセルに入力されたデータは どういう風に保存するのでしょうか? XML関連のページを見たりしてJavaでXML文書を操作 出来ると言うのは一応理解してますが、 その処理をどういう風にJTableを使って作れば良いのか 判らないんです。 稚拙な質問かもわかりませんがよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kacchann
- ベストアンサー率58% (347/594)
#No.2です。 表(Table)というのは、 「タテ5列×ヨコ3行」 というように、 いわば”2次元配列的に”セルが並んでいる。 ------------------------- 話は変わって…。 ここに二次元配列 cell[3][5] があるとする。 これをファイルに保存するには、どうしたらよいか? 無理のない、かつ簡単な方法は for(x=0; x<3; x++) { for (y=0; y<5;y++) { write(cell[x][y]);//セル(x, y)の値 write(",");//カンマ } write("\n");//改行 } だろう。 (「CSV形式」で検索) --------------------------- JTableでの表を扱うにしたって、 「表のデータ」が存在するはずで(だよね?)、 さらにそのセル(x, y)にアクセスする方法も存在するはずで、 そのアクセス方法は、基本的には cell[x][y] というふうに2次元配列で提供されているか、または getCell(x, y); というふうにメソッドで提供されているか、のどちらかであろう。 いずれにせよ、 「表形式のデータを保存する方法」 というのは、 「セル一個一個のデータを地道にテキストファイルに並べて書き出す」 というのが基本。 (その書き出し方として、「カンマ区切り(CSV形式)」を採用するか 「XML形式」を採用するかはプログラマの自由) --------------------------- ちなみに… JTableによる表の「データ」の管理を担当しているのは、 JTableではなくTableModelというモノ。 つまり、「表の保存」をやりたいのなら、 JTableにアクセスするのではなく、 (JTableが持つ)TableModelのほうにアクセスする必要がある。 //↓このページの冒頭部(概要説明)も参考に。 http://java.sun.com/j2se/1.4/ja/docs/ja/api/javax/swing/JTable.html //↓このページの冒頭部にテーブルモデルについての説明がある http://www.javadrive.jp/tutorial/jtable/index1.html ※このページの最後のほうに DefaultTableModelを使ったサンプルがあるので、みてみよう。
- kacchann
- ベストアンサー率58% (347/594)
>XMLを使うのが手軽 「XML使えば手軽」ということはないと思います。 (すくなくともXML使う必然性はない)
- jun-1
- ベストアンサー率29% (18/61)
長文ですが、以下のようでどうでしょうか? ================================================= import java.util.*; import javax.swing.*; import javax.swing.table.*; class Table { public static void main(String[] args) { Table t = new Table(); } Table() { Vector columnNames = new Vector(); for (int i = 0; i < 10; i++) { columnNames.add(String.valueOf(i)); } Vector data = new Vector(); Vector tmp; for (int i = 0; i < 10; i++) { tmp = new Vector(); for (int j = 0; j < 10; j++) { tmp.add(String.valueOf(j)); } data.add(tmp); } JFrame jf = new JFrame(); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTable t = new JTable(new TableView(columnNames, data)); if (t.getColumnCount() > 5) { t.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); TableColumnModel tcm = t.getColumnModel(); for (int i = 0; i < t.getColumnCount(); i++) { tcm.getColumn(i).setPreferredWidth(100); } } JScrollPane js = new JScrollPane(t); jf.getContentPane().add(js); jf.setSize(500,500); jf.setVisible(true); } } class TableView extends AbstractTableModel { Vector columnNames; Vector data; TableView() { columnNames = new Vector(); data = new Vector(); } TableView(Vector columnNames, Vector data) { this.columnNames = columnNames; this.data = data; } public int getColumnCount() { return columnNames.size(); } public int getRowCount() { return data.size(); } public String getColumnName(int col) { return (String) columnNames.elementAt(col); } public Object getValueAt(int row, int col) { return ((Vector) data.elementAt(row)).elementAt(col); } public Class getColumnClass(int col) { return columnNames.elementAt(col).getClass(); } public boolean isCellEditable(int col) { return true; } public void setValueAt(Object value, int row, int col) { ((Vector) data.elementAt(row)).removeElementAt(col); ((Vector) data.elementAt(row)).add(col, value); } } ================================================= データ保存に関しては別にXMLでなくても自分の好きな 方法でいいと思いますよ(ただのプレーンテキストでもDBでも)。 あ、あと上記のソースはセルへの入力は対応していません(表示のみ)。 javax.swing.table.TableCellRenderer javax.swing.table.TableCellEditor を使わないと実現できません。 上記ソースの意味が理解できたらまたレスします。
お礼
早速回答を頂いたのに返事が遅れてしまって 大変申し訳ありません。 今、TableCellRendererとTableCellEditorについて リファレンスを見てたんですが、イマイチよく判りませんでした(;^_^A アセアセ・・・ 書いて頂いたソースの内容はそれとなく理解できるんですけど… Renderer(はよく判らないんですが)、Editorを使ってセルを編集出来るようにするんですよね? XMLは比較的、簡単に文書を構造化して保存出来るとの事なので 利用しようかと思ったのですが… 後、DBはよく判らないです(;^_^A アセアセ・・・
お礼
手軽ではないんですか… 自分で出来る範囲で調べたんですがDB使うよりは 手軽だと思ったのですが。