2

いくつかの調査の結果、JTable内に数式を実装する方法(正しく理解していれば、長くて退屈な方法)を見つけました。

テーブルは次のようになります(おそらくお分かりのように、NetBeansで編集されています。大規模なヌル部分は気にしないでください。後で説明します)

    contractFlaminiaTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {"name1", null, null, null, null, null, null, null, null, null, null},
            {"name2", null, null, null, null, null, null, null, null, null, null},
            {"name3", null, null, null, null, null, null, null, null, null, null},
            {"name4", null, null, null, null, null, null, null, null, null, null},
            {"name5", null, null, null, null, null, null, null, null, null, null},
            {"name6", null, null, null, null, null, null, null, null, null, null},
            {"name7", null, null, null, null, null, null, null, null, null, null},
            {"name8", null, null, null, null, null, null, null, null, null, null},
            {"TOTAL", null, null, null, null, null, null, null, null, null, null}
        },
        new String [] {
            "  ", "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9", "TOTAL"
        }
    ) {
        Class[] types = new Class [] {
            java.lang.String.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Object.class
        };
        boolean[] canEdit = new boolean [] {
            false, true, true, true, true, true, true, true, true, true, false
        };

        public Class getColumnClass(int columnIndex) {
            return types [columnIndex];
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    contractFlaminiaTable.setRowHeight(30);
    contractFlaminiaTable.getTableHeader().setReorderingAllowed(false);
    flaminiaScrollPane2.setViewportView(contractFlaminiaTable);
    contractFlaminiaTable.getColumnModel().getColumn(0).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(1).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(2).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(3).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(4).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(5).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(6).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(7).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(8).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(9).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(10).setResizable(false);
    contractFlaminiaTable.getColumnModel().getColumn(10).setPreferredWidth(48);

したがって、問題は、name1 / 2 / etcの行と列の中に数字があるはずです(netbeansによって自動的に作成されたnullスパムの代わりに、カスタムtableModelを作成するアプリに「リセット」ボタンがありますが、ここでは役に立たない古いビルドでした)、行/列の合計には、それぞれの列/行の数値の合計があるはずです。

私が読んだ多くのスレッドから、それぞれの行/列のセルを合計するために使用できるgetValueAtメソッドがあります。ここでそれが良い選択かどうかはわかりませんが、毎回読み取る必要のあるセルの量が多いためです(ユーザーがテーブルに数値を入力すると、合計を動的に更新することになっていますが、私は数えませんまた、特定のセルに実装する方法もわかりません)。

そしてここに質問があります:

a)セルを追加するためのExcelのような数式を作成することは可能でしょうか?(セルc2:c6を追加するようなものです。そのテーブルをExcelファイルにエクスポートするので、そのような何かが可能かどうかも考えました。)

2a)列の型をオブジェクトに変更する必要がありますか、それとも数式は整数と見なされますか?(文字列型として実装されている名前列を除いて、他のすべての列は整数型です。また、エンドユーザーは数式を混乱させないように数値を挿入することしかできないはずですが、型をオブジェクトに変更すると、実際には次のことが可能になります。文字も挿入)

b)テーブルのeventListenersを使用して、Excelに似ていない式を作成することは可能ですか(a-それが不可能な場合)?(「row(x)、col(y)内のデータが変更され、合計でセル全体が更新されました!」のようなもの)

c)テーブル内のデータはxlsファイルにエクスポートされるため(別のスレッドでいくつかのポインターを取得した後、すでに正しく実装されています)、そのファイルを使用してテーブルに再度データを入力することは可能ですか、それとも毎回再描画する必要がありますか? ?

これらすべての質問を一緒に行って申し訳ありません(特に、タイトルとは関係がないため、c-)が、オラクルが提供するjTableクラスのチュートリアルにも、他の同様のような建設的なアドバイスも実際には見つかりませんでした。スレッド。

他のスレッドで述べられているように、私はまだ初心者です(私がそうだと見なすことができれば!)また、助けてくれてありがとう、他のポインターは本当に私を助けてくれました!

PS:わかりやすい方法で説明したと思います。プログラミングの世界に慣れていないからといって、説明しなければならないときに物事が簡単になるわけではありません。

繰り返しになりますが、よろしくお願いします〜

編集:

これが私がテーブル内に数式を実装するために思いついたコードです(実際にはget / setValueAt()の奇妙な使用法ですが、かなりうまくいくようです(少し不格好ですが、改善の余地があると、常により多くのことを学ぶことができます)一日の終わりにいいです)

class TotalButton {

public TotalButton(JTable jTable) {
    // get table model
    TableModel model = jTable.getModel();

    // declare for variables
    int x;
    int y;

    // initialize table placeholder
    int totalValue = 0;

    int rowCount = model.getRowCount();
    int columnCount = model.getColumnCount();

    // for loop for the first row
    for (x = 0; x < rowCount; x++) {
        for (y = 1; y < columnCount; y++) {
            if (y == 10) {
                break;           // break when the loop reaches the total column
            }
            if (x == 0) {

                String value = (String) model.getValueAt(x, y);
                if ("".equals(value)) {
                    value = "0";            // avoiding empty string to integer error
                }
                int tempVal = Integer.parseInt(value);           // turn the string into a number

                totalValue = totalValue + tempVal;          // adds the numbers to the total
            }
        }

        String finalValue = Integer.toString(totalValue);           // turn the number to a string
        model.setValueAt(finalValue, 0, 10);            // set total column value
    }

基本的に、テーブルの行/列の合計を計算して入力するためのボタンを追加しました(ある時点でkeyListenerを追加しましたが、私が言ったように、ボタンを使用することは少し違和感がありますが、気分が悪いというわけではありません)。 。

スニペットで読み取ることができるループは、合計行/列のすべてのセルに追加されます(すべてのセルでほぼ同じであるため、一部のみが投稿されます)。

また、列タイプをString(後でInteger.parseInt()およびInteger.toString()に使用される)に設定できるように、jTableモデルのnull-sを""-sに変更する必要がありました。

ちなみに、keyListenerは少し不格好だと感じましたが、テーブルを「リアルタイム」で更新します(テーブルに新しい値を挿入すると、次のキーストロークまでkeyPressed()としてカウントされないため、「リアル」と言います。理由)。

繰り返しになりますが、ポインタのおかげで、プログラムは実際にコード/ロジックの磨きを使用できたとしても、かなりうまく機能しているようです(私は現在取り組んでいます)。

PS:それが最善の解決策とはほど遠いことはわかっていますが、かなりの調査を行った後、自分で作成したので、少し嬉しいです(もちろん、すでに述べたように、ポインターがなければ、それを書くことはできなかったでしょう。コード)

PPS:もう一度、ありがとうございます:P

4

2 に答える 2

3

数値の場合は、TableModel式をasとして保存Stringし、実装でgetValueAt()式の評価結果を返すようにします。いくつかのライブラリが利用可能です。

于 2012-09-06T16:12:23.427 に答える
0

実際、文字列をintに変換する部分では、intにできない場合に0にするtry/catchブロックを使用した方がよい場合があります。そうすれば、Bob、3.1415926などをそこに入れれば処理できます。

于 2013-11-09T17:25:27.617 に答える