2012-05-13 7 views
1

私の説明は以下のようになります。沸騰して、行を追加して複数の行を追加し、更新するイベントを発生させることができますそれらのすべてをすぐに?カスタムモデルにテーブルデータを格納するコードを追加する必要はありませんか?カスタムJTable TableModelのaddRows()メソッドを作成する

DefaultTableModelから拡張されたカスタムTableModelを持っているため、自分のカスタムメソッドを持っている間にDefaultTableModelを使用してデータを追跡できます。

問題は、私が複数の行を追加したいときに、「addRows(String [] [] val)」メソッドを持つほうが速いかもしれないと思っていました。その後、一度にすべての行を更新するためにfireTableDataChanged()のような単一のイベントを発生させることができます。たとえば、私の現在の方法:

JTable table1 = new JTable(new dgvTableModel(new String[] {<values>},0, new String[] {<values>})); 
table1.addRow(new String[] {<values here>}); 
table1.addRow(new String[] {<values here>}); 
table1.addRow(new String[] {<values here>}); 

私はこのように必要な回数だけ上記を繰り返します。問題は、それぞれが別々のイベントを起こすことです。

JTable table1 = new JTable(new dgvTableModel(new String[] {<values>},0, new String[] {<values>})); 
table1.addRows(new String[][] {{<values1 here}, {values2 here}, . . .}}); 

、その後、テーブルモデルに:

public void addRows(String[][] values) { 
    for (String[] vals : values)   
     super.addRow(vals); 
    } 
    fireTableDataChanged(); 
} 

私はこれを簡単にでコーディングすることができ、私はこの私のカスタム・テーブル・モデルを使用して操作を行うことができれば、はるかに高速(と思う)になります。問題は再び、 "super.addRow(vals);"行ごとにイベントが発生します。私のモデルにテーブルデータ自体が含まれているコードを追加することなく、行を追加するたびにそのイベントが発生しないようにする方法はありますか?そのようにして、addRowsメソッドでfireTableDataChanged()呼び出しを待機しますか?参考のため

、私のカスタム・テーブル・モデルのコード:

import java.awt.Color; 
import java.util.ArrayList; 
import javax.swing.UIManager; 
import javax.swing.table.DefaultTableModel; 

public class dgvTableModel extends DefaultTableModel { 
//private DataTable tableVals = new DataTable(); 
private ArrayList<Color> rowColors; 

//private ArrayList<Object[]> data = new ArrayList<>(); 
//default constructor has no data to begin with. 
private int[] editableColumnNames; 

public dgvTableModel(String[] colNames, int rowCount) 
{ 
    super(colNames, rowCount); 
} 

public dgvTableModel(String[] colNames, int rowCount, String[] editableColNames) 
{ 
    super(colNames, rowCount); 
    //this.tableVals.setColNames(colNames); 
    if (editableColNames!=null && editableColNames.length >0) 
    { 
     editableColumnNames = new int[editableColNames.length]; 
     int count = 0; 
     for (int i =0; i< editableColNames.length;i++) 
     { 
      for (String val : colNames) 
      { 
       if (val.equalsIgnoreCase(editableColNames[i])) 
       { 
        editableColumnNames[count] = i; 
        count+=1; 
        break; 
       } 
      } 
     } 
    } 
} 

public dgvTableModel(String[] colNames, int rowCount, String[] editableColNames, boolean colorChanges) 
{ 
    super(colNames, rowCount); 
    Color defColor = UIManager.getDefaults().getColor("Table.background"); 
    if (editableColNames!=null && editableColNames.length >0) 
    { 
     editableColumnNames = new int[editableColNames.length]; 
     int count = 0; 
     if (colorChanges) 
     { 
      rowColors = new ArrayList<>(); 
     } 
     for (int i =0; i< colNames.length;i++) 
     { 
      if (colorChanges) 
      { 
       rowColors.add(defColor); 
      } 

      for (String val : editableColNames) 
      { 
       if (val.equalsIgnoreCase(colNames[i])) 
       { 
        editableColumnNames[count] = i; 
        count+=1; 
        break; 
       } 
      } 
     } 
    } 
    else if (colorChanges) 
    { 
     rowColors = new ArrayList<>(); 
     for (String val : colNames) 
     { 
      rowColors.add(defColor); 
     } 
    } 
} 

@Override 
public boolean isCellEditable(int row, int column) 
{ 
    if(editableColumnNames!=null && editableColumnNames.length >0) 
    { 
     for (int colID : editableColumnNames) 
     { 
      if (column==colID) 
       return true; 
     } 
    } 
    return false; 
} 

public void setRowColor(int row, Color c) 
{ 
    rowColors.set(row, c); 
    fireTableRowsUpdated(row,row); 
} 

public Color getRowColor(int row) 
{ 
    return rowColors.get(row); 
} 

@Override 
public Class getColumnClass(int column) 
{ 
    return String.class; 
} 

@Override 
public String getValueAt(int row, int column) 
{ 
    return super.getValueAt(row, column).toString(); 
} 
} 

は確かにすべての行を表示するには、一つのイベントを発射、行ごとに一つのイベントを発射するよりも速いのですか?

答えて

2

'AbstractTableModel.fireTableDataChanged()'は、テーブル内のすべての可能なデータが変更され、チェックする必要があることをモデル(モデルによって通知されるJTable UI)に示すために使用されます。これは高価な操作になる可能性があります。追加された行が分かっている場合は、代わりに 'AbstractTableModel.fireTableRowsInserted(int firstRow、int lastRow)'メソッドを使用してください。これにより、エフェクト行のみが変更されていることが確認されます。すべての火災方法をAbstractTableModelに見てください。あなたは本当に行、セルなどが汚れていると見なされる細かい粒度のコントロールを実行することができます。

あなたのやっていることは時期尚早の最適化であるかもしれません。 JTableに50個のレコードがある場合を除き、これはおそらく目立たないでしょう。しかし、JTableに大量のレコードがある場合は、とにかくそれらを読み込むのが怠惰かもしれません。

+0

これらのJTableは、10個以上のレコードを持つことはできません(少なくともSHOULD).30個以上のレコードを持つことは決してありません。 fireTableRowsInsertedについて私が理解しているのは、DefaultTableModelのaddRow関数を使用すると、addRow関数がそれ自身を起動した後に起動するということでした。私はカスタムモデルから直接DefaultTableModelのデータにアクセスすることはできません。少なくとも私が知っている限り。 – Legowaffles

+0

JTablesは数十万のレコードでも高速に動作します。彼らは本当に速く、よく書かれています。その中に数千ものレコードがある場合には、上記のものにだけ気を付けるべきです。あなたのケースでは時期尚早の最適化であり、すべての行に対してfireTableDataChangedを呼び出し、それを使って完了できます:-) 500行が含まれていても、目立った影響はありません。 –

+0

申し訳ありませんが、ありがとうございます。 – Legowaffles

関連する問題