私のプログラムには、「保存」と「更新」という名前の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){
この点に関して私に親切に提案してください。「更新」ボタンをクリックすると、最後のボタンを破棄してフレーム自体を呼び出す別のオプションがあります。行うのは良い習慣ですか?提案。