0

私のプログラムには、「保存」と「更新」という名前のJTableと2つのボタンがあります。私のプログラムの概要:

手動で、JTableに10行を入力しました。「保存」ボタンをクリックして、これらのデータをデータベースに更新しました。

今私のポイントは:

「更新」ボタンをクリックすると、次のエントリのためにJTableのすべての行をクリアする必要があります。

dataModel = new AbstractTableModel() {
        private String[] columnNames = {"Sl No","Material Code", "Material         Name", "Quntity", "Unit", "Unit/Price","Total Price", "Status" };//new String[9];
        private Object[][] data = new Object[100][9];

          public int getColumnCount() { return columnNames.length; }
          public int getRowCount() { return data.length;}
          public String getColumnName(int col) {
            // TODO Auto-generated method stub
            return columnNames[col];
        }
          public Object getValueAt(int row, int col) {
            // TODO Auto-generated method stub
            return data[row][col];
        }

        @Override
        public void setValueAt(Object aValue, int row, int col) {
            // TODO Auto-generated method stub
            data[row][col] = aValue;
            fireTableCellUpdated(row, col);
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            // TODO Auto-generated method stub
            return true;
        }
        public Class getColumnClass(int col) {
            if((col == 3) || (col == 5) || (col == 6))
                return Double.class;
            //return getValueAt(0, c).getClass();
            return String.class;
        }
      };

抽象データモデルを使用してテーブルを作成します。

    table = new JTable(dataModel);
    JTableHeader header = table.getTableHeader();
    header.setBackground(Color.yellow);
    JScrollPane pane = new JScrollPane(table);
    pane.setPreferredSize(new Dimension(800, 350));
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

このパネルをContentPaneに追加します。

   panel.add(pane);
    panel.setBounds(100, 100, 800, 360);
    c.add(panel);

フレームには「更新」ボタンがあります。actionPerformed(ActionEvent e) {} 手動でデータをJTableに入力しました。「保存」ボタンをクリックして、これらのデータをデータベースに更新しました。

今私のポイントは:

「更新」ボタンをクリックすると、テーブルのすべてのセルがクリアされます。

私はTableModeListner以下のように実装しました。

public void tableChanged(TableModelEvent e) {
// TODO Auto-generated method stub
int row = e.getFirstRow();
int column = e.getColumn();

row_slは0で初期化されます。

 if(row_sl >= row){
 if(column == 1){
 String dat = (String) dataModel.getValueAt(row, column);
dataModel.removeTableModelListener(this);

//データベースをフェッチし、マテリアル名とユニットを取得します。次に、それぞれの列に設定します。

   mat.getmaterial_name(dat); 
       dataModel.setValueAt(mat.materialname, row, column+1);
dataModel.setValueAt(mat.unit, row, column+3);
//dataModel.setValueAt(dat, 1, 2);
dataModel.addTableModelListener(this);
}
if((column == 5) && (Double)dataModel.getValueAt(row, 3) != null){
    dataModel.removeTableModelListener(this);
    Double d = (Double) dataModel.getValueAt(row, 3);
    d = d * (Double)dataModel.getValueAt(row, column);
    dataModel.setValueAt(d, row, 6);
    dataModel.addTableModelListener(this);
}
if(row == row_sl && column == 7)
    row_sl ++;
}
else
    new error_frame("Complete the row no:"+row_sl);

  public void actionPerformed(ActionEvent e) {
  if(e.getSource() == Refresh){
     dataModel.removeTableModelListener(this);
        for (int i=0;i<=count;i++){
            for(int j=0;j<=7;j++){
                    dataModel.setValueAt(null, i, j);
            }
        }
        dataModel.addTableModelListener(this);
 }
}

「更新」ボタンをクリックすると、メソッドdataModel.setValueAt(null, i, j);が呼び出されます。TableModeListnerこのメソッドはイベントをトリガーしますpublic void tableChanged(TableModelEvent e)

したがって、問題が発生します。私の要件は:

[更新]ボタンをクリックすると、このメソッドのコードに影響を与えることなく、すべてのテーブルセルをクリアする必要がありますpublic void tableChanged(TableModelEvent e){

この点に関して私に親切に提案してください。「更新」ボタンをクリックすると、最後のボタンを破棄してフレーム自体を呼び出す別のオプションがあります。行うのは良い習慣ですか?提案。

4

2 に答える 2

2

ここで説明したように、削除するにはモデルの内部データ構造を更新する必要があります。適切なアプローチの 1 つは、いくつかの行と列の配列を単純に作成することです。

data = new Double[rows][cols];
fireTableDataChanged();

Arrays.fill()また、デフォルト値を置き換えることも検討してnullください。

于 2013-02-08T10:28:06.933 に答える
0
public static void removeAllDataFromJTable(JTable table) {
    f=flase;
    int numberOfRows = table.getRowCount();
    int numberOfColumns = table.getColumnCount();
    int rowCounter = 0;
    int columnCounter = 0;
    //we will travel to every row and clean it
    for (rowCounter = 0; rowCounter < numberOfRows; rowCounter++) {
        for (columnCounter = 0; columnCounter < numberOfColumns; columnCounter++) {
            table.setValueAt(null, rowCounter, columnCounter);
        }
    }
}

static boolean f = true;

 public void tableChanged(TableModelEvent e) {

 if(f){------}
 }

  public void methode(){
removeAllDataFromJTable(table);
f=true;
  }
于 2013-02-08T10:24:33.150 に答える