質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

4389閲覧

java jtableを使った表計算プログラム

kinosita

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/01/11 12:11

###前提・実現したいこと
初めて利用させていただきます。
よろしくお願いします。

利用方法がよくわかっていないので、回答していただいた方へ、
お礼ができないかもしれません。
申し訳ありません。ご容赦ください。

さて、質問です。
java jtableで表計算プログラムを作ろうとしましたが、
列の合計をする方法がわかりません。
下記のソースでは、行の合計は出るのですが、
列の合計はどうすればいいのでしょうか。

リスナーを列用にもう一つ用意すればよいのでしょうか。

###該当のソースコード
/** JTableのテスト{1列目+2列目の計算結果を3列目に表示} */

import javax.swing.;
import javax.swing.table.
; //テーブルモデルを定義するために必要
import javax.swing.event.*; //TableModelEventを利用するために必要

public class SwingJTableTest4 implements TableModelListener {

private JTable table; private JScrollPane sp; private DefaultTableModel model; /** コンストラクタ */ public SwingJTableTest4() { // headerで定義したヘッダを元に5行のテーブルモデルを生成 String[] header = { "Japanese", "Math", "Sum" }; model = new DefaultTableModel(header, 5); table = new JTable(model); sp = new JScrollPane(table); model.addTableModelListener(this); // modelのイベント通知登録 } /** テーブルに編集が加えられたときの処理 */ public void tableChanged(TableModelEvent evt) { int a, b; int row = evt.getFirstRow(); // 選択されている(先頭)行を取得 if ( evt.getColumn() == 2) { // 3列目が編集されたら何もしない return; } // 1列目と2列目の内容を整数へ変換(不正な値は0とする) try { a = Integer.parseInt((String)model.getValueAt(row, 0)); } catch(NumberFormatException nfex) { model.setValueAt("0", row, 0); a = 0; } try { b = Integer.parseInt((String)model.getValueAt(row, 1)); } catch(NumberFormatException nfex) { model.setValueAt("0", row, 1); b = 0; } // 1~2列目の計算結果を3列目に設定 model.setValueAt(new Integer(a+b), row, 2); } /** main() */ public static void main(String[] args) { SwingJTableTest4 sample = new SwingJTableTest4(); JFrame frame = new JFrame("JTableTest4"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(sample.sp, "Center"); frame.pack(); frame.setVisible(true); }

}

###試したこと
public void tableChanged(TableModelEvent evt)の中に、
int a1,a2
a1 = Integer.parseInt((String)model.getValueAt(1, 0));
model.setValueAt(new Integer(a+a1), 3, 0);

などとやってみたらunknownメッセージが出て、
メッセージをどう読めばよいのかわからず、
質問させていただいた次第です。

###補足情報(言語/FW/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/01/11 14:23

「unknownメッセージ」ではちゃんと伝わらない気がします。変に省略せずにきちんと書きましょう。
narita_takashi

2017/01/12 03:54

何か例外が発生したのであれば、そのスタックトレースをお願いします。またコードは https://teratail.com/help に書かれている「```」で括って頂けるととても見やすくなって有り難いです
kinosita

2017/01/13 15:58

個別にお返事したかったのですが、できないのでまとめてお礼を申し上げます。今後もいろいろご指摘、ご指導ください。すみません、スタックトレースという言葉自体知りませんでした。もう少し勉強してトレースできるようにします。
guest

回答1

0

「コードを書いてみたけどコンパイルエラーが出てしまった」「特定の列の合算をどういう考え方でやればいいのか」質問の意図がどちらかわかりませんが、後者だとしてコメントします。

テーブルの合計行をTableModelの最後の行とでも決めておき、合計行以外の任意の値を編集させてその変更結果を即座に合計行へ反映するなら現在合計列を計算しているハンドラーの中でTableModelの該当列の合計を求めなおして合計行の該当列を更新するといったふうに書けばいいだけのように思います。
TableモデルにはI行J列の任意のセルの値をアクセスするメソッドが用意されているのでそれを用いて集計対象のセルの値を順番に加算し結果を合計行の該当するセルへ設定してやると表示内容が自動的にかわると思います。
合計行をユーザーが編集不可とするように若干工夫が必要かも知れません。その方法についてもリファレンスを見ていけばわかると思います。

投稿2017/01/13 05:39

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinosita

2017/01/13 16:26

ご回答ありがとうございました。まず、やりたいことは、Execlにような表計算プログラムを作りたかったです。 したがって、表計算プログラムができるのであれば、どのような方法でもいいので、いろいろ試してみましたが、うまくいきませんでした。 その中には、KSwordOfHaste様ご指示の内容と同じではないかと思うのですが、リスナーの中でmodel.getValueAt(x, y)でセルを指定して、計算結果を書き出すセルを指定して、実行したのですが、結果unknown他たくさんエラーメッセージが出ました。 エラーメッセージは何が書いてあるのか、どこ見て、何を見て解析すればいいのか、さっぱりわからなくて、それでこのサイトで抽象的な質問に至った次第です。 要するに表計算プログラムを作りたかったです。jtableを使ったのは、単にExcelの表に似ていたからにすぎません。つまり、表計算できれば何でもよかったのです。 それで、今はjavaでは表計算プログラムを作ることができないのかなと思い、POIの利用を考えています。POI自体も使ったことがないので、うまくいくかいかないか分かりませんが。
KSwordOfHaste

2017/01/13 17:09

質問コメントにも書きましたが「unknown」だけでは何のことかわからないのです。正確なエラーメッセージあるいは具体的なコードそのものを記載すればおそらくその原因は回答者にも推測しやすかったと思います。要するに正確に事実を記すことがプログラミングすることやプログラミング上のコミュニケーションをとる際に一番大切なのです。そこをくみ取っていただけなかったようで残念ですが。 なお、POIはJavaでMicrosoft Officeのドキュメントファイルを読み書きするものでGUIの機能もなかったと思いますので期待されているような表計算ができるものではないように思います。Javaで作るという前提ならばswing/JavaFXで作成するのが一番素朴なアプローチだと思います。
kinosita

2017/01/14 15:17

貴重なご意見ありがとうございました。勝手も分からず、今回初めて投稿させていただいたのは、 ネットで調べても対応策がなく、思い悩んだ末、止むに止まれずの行動でした。次回からは、 エラー情報などできるだけ詳細にして投稿したいと思いますので、よろしくお願いします。 なお、いろいろな操作をしたため、どの操作でどのエラーになったのかわからなくなってしまい、 エラー情報を残していませんでした。失礼しました。
KSwordOfHaste

2017/01/14 15:26

まぁそんなこともあるでしょう。プログラミングやデバッグの際には事実をおさえておくのが大事という点を教訓にしていただければと思います。きっと最初はみんな同じような失敗をして学んだはずです。同じ失敗を繰り返しさえしなければいいと思いますよ・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問