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

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

ただいまの
回答率

90.85%

  • Java

    12491questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 665

kinosita

score 0

前提・実現したいこと

初めて利用させていただきます。
よろしくお願いします。

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

さて、質問です。
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/ツール等のバージョンなど)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KSwordOfHaste

    2017/01/11 23:23

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

    キャンセル

  • narita_takashi

    2017/01/12 12:54

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

    キャンセル

  • kinosita

    2017/01/14 00:58

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

    キャンセル

回答 1

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/14 01:26

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

    キャンセル

  • 2017/01/14 02:09

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

    キャンセル

  • 2017/01/15 00:17

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

    キャンセル

  • 2017/01/15 00:26

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

    キャンセル

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

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    12491questions

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