2011-12-14 5 views
0

かなり複雑なデータがあり、現在試みているデータ内に1対多の関係があるため、ハッシュテーブルを含む他のクラスを指すハッシュテーブルに存在します保存する。テーブルモデルとオブザーバを一緒に使用する方法を理解するのに問題がある

世界の反対側では、データモデルへの接続がないことを除いて、非常にうまく動作するテーブルがあります。それはそれ自身のテーブルモデルです。私はmanner-非常にシンプルで、それを作成

Object[][] tableData = new Object[4][ tableHeaders.length ]; 
modelTablet = new TabletTableModel(tableData, tableHeaders); 

私のタブレットのデータモデルは、私はまた、アドオンのようなことを行うと、行を削除する必要があるため、私にスイート

class TabletTableModel extends DefaultTableModel { 

    public TabletTableModel(Object rowData[][], Object columnNames[]) { 
     super(rowData, columnNames); 
    } 

    @Override 
    public Class getColumnClass(int col) { 
     if (col == 0) { 
      return String.class; 
     } else { 
      return Double.class; 
     } 
    } 

    @Override 
    public boolean isCellEditable(int row, int col) 
    { 
     if (col == 0 || col == activeColumn) 
     return true; 
     else 
     return false; 
    } 
} 

非常に単純であるとこのシンプルなデータモデルは、仕事のほとんどが私のために行われます。私は、列のヘッダーをクリックしたときに、それがアクティブになり、隣接する列内のセルは、彼らが何であることを示すないために別の色に塗り替えているように、私もマウスリスナーとセルレンダリングを実装しました

class AddRowActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
    DefaultTableModel model = (DefaultTableModel)tableTablet.getModel(); 
    model.addRow(new Object[3]); 
    System.out.println(Arrays.deepToString(tableData)); 
    } 
} 

編集可能な状態。

これまでのところ、私のインターフェイスでは、最初のテーブルの結果を要約した2番目のテーブルがありました。 3行だけで、ヘッダはありません。私が作ったときに必要だった以上に多くの仕事をしたかもしれないと思う。

modelSummary = new SummaryTableModel(1, tableHeaders.length); 
tableSummary = new JTable(modelSummary); 

class SummaryTableModel extends DefaultTableModel { 

    public SummaryTableModel(int rows, int columns) { 
     super(rows, columns); 
    } 

    @Override 
    public Class getColumnClass(int col) { 
     if (col == 0) { 
      return String.class; 
     } else { 
      return Double.class; 
     } 

    @Override 
    public boolean isCellEditable(int row, int col) 
    { 
     if (col == 1 && activeColumn == 2) 
     return true; 
     else 
     return false; 
    } 
} 

だからそれは私のテーブルの素敵なセットを与え、彼らがすることになっているように、彼らは色を変更、彼らは有効な値にデータを制限し、(私のレンダラで、私は表示されませんでした)それを適切にフォーマットします。

しかし、ここでは、ユーザーが表1の列1に値を入力した後、列1のすべての値を合計し、表2の列1の値を合計して再計算する必要がありますこの新しい値に基づいて表1の列2のすべての値。

逆に、列2がアクティブな列でユーザーが表1の列2の値を変更した場合、表2の列1の値を取得し、列1のすべての値を再計算する必要がありますまた、列2の値を合計し、表2の列2に配置します。列2の数値の合計が100を超えるような新しい値をユーザーが入力できないという注意点があります。

テーブル2も編集することができます。テーブル1のすべての値を計算する必要があります。

私は観測可能なはずです観察可能な。だから私は観察可能なものを書くことができますが、私はまだ2つのテーブルデータモデルを持っています。私は多くのことを読んできましたが、私が見つけたすべての例は、Observableクラスを使用せずに、テキストフィールドやテーブルモデルのようなシンプルなもので使用されるオブザーバブルで示されています。もう1つの問題は、デフォルトモデルがデフォルトでうまくいくということを、行の追加や型のチェックなどのクールなものの大部分をどうやって行うのか分かりません。

私のプロジェクトに全く新しい次元を追加する前に、誰かに私にいくつかのポインタを教えてもらえますか?ほとんどの場合、行や列の概念を持たないデータモデルを、テーブルデータモデルと混在させるのは簡単ですか?何らかの方法で、すべてのデフォルトテーブルモデル操作を再度記述する必要はありませんか?今のところ私はプロセス全体が信じられないくらい複雑に思えます。私はこれがどのように機能すべきかについて明確に説明する必要があります。

答えて

1

テーブルモデルは既に観察可能です。TableModelListenerを追加して、テーブルモデルで変更が発生するたびに呼び出すことができます。したがって、2番目のモデルは最初のモデルのリスナーになる可能性があり、逆も同様です。

私は通常、すべてのドメインオブジェクトを配列に変換する必要があるため、DefaultTableModelは使用しません。私は通常、ドメインオブジェクトのリストをラップするAbstractTableModelサブクラスを作成します。セルの値を取得するには、通常、リスト内の指定された行(インデックス)でオブジェクトモデルを取得し、その列に応じてオブジェクト上で適切なゲッターを呼び出します。

値を設定するには、オブジェクトで適切なセッターを呼び出し、イベントを発生させる必要があります。

表モデルのチュートリアルについては、http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#dataを参照してください。

関連する問題