简体   繁体   English

如何在按下JButton后清除JTable内容?

[英]How to clear a JTable contents after pressing a JButton ?

In my program There is a JTable and 2 Buttons named "Save" and "Refresh". 在我的程序中有一个名为“保存”和“刷新”的JTable和2个按钮。 My program overview : 我的计划概述:

Let, Manually i have entered 10 rows into the JTable. 让我手动输入10行JTable。 Than i updated these data into database by clicking "Save" button. 比我通过单击“保存”按钮将这些数据更新到数据库中。

Now my point is : 现在我的观点是:

When "Refresh" button will be clicked, All the rows of the JTable should be cleared for next entry. 单击“刷新”按钮时,应清除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;
        }
      };

create table with abstract datamodel. 使用抽象datamodel创建表。

    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);

Add this panel to ContentPane. 将此面板添加到ContentPane。

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

Frame hase a button "Refresh". 框架有一个按钮“刷新”。 actionPerformed(ActionEvent e) {} Manually i have entered the data into JTable. actionPerformed(ActionEvent e) {}手动我已将数据输入JTable。 Than i updated these data into database by clicking "Save" button. 比我通过单击“保存”按钮将这些数据更新到数据库中。

Now my point is : 现在我的观点是:

When "Refresh" button will be clicked, All the cell of the table should be cleared. 单击“刷新”按钮时,应清除表的所有单元格。

i have implemented TableModeListner as below. 我已经实现了TableModeListner ,如下所示。

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

row_sl is intialised with 0. row_sl初始化为0。

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

//it fetches database and retribes material name and unit. //它获取数据库并重新分配材料名称和单位。 then set it to respective column. 然后将其设置为相应的列。

   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);
 }
}

When "Refresh" button clicked the method dataModel.setValueAt(null, i, j); 当“刷新”按钮单击方法dataModel.setValueAt(null, i, j); is being called. 被称为。 This method triggers TableModeListner event public void tableChanged(TableModelEvent e) . 此方法触发TableModeListner事件public void tableChanged(TableModelEvent e)

Hence problem arrises. 因此问题就出现了。 My requirment is : 我的要求是:

When "Refresh button is clicked, all the table cell should be cleared, without affecting my code under this method public void tableChanged(TableModelEvent e){ 单击“刷新”按钮时,应清除所有表格单元格,而不影响此方法下的代码public void tableChanged(TableModelEvent e){

Kindly suggest me in this regard. 请在这方面建议我。 I have another option when "Refresh" button is clicked it will call the frame itself by disposing the last on. 单击“刷新”按钮时,我有另一个选项,它将通过处理最后一个来调用框架本身。 Is it good practice to do ? 这是好的做法吗? Suggest. 建议。

As discussed here , removal requires updating your model's internal data structure. 随着讨论这里 ,去除需要更新模型的内部数据结构。 One expedient approach is to simply create the array for some number of rows and columns: 一种方便的方法是简单地为一些行和列创建数组:

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

Also consider Arrays.fill() to supplant the default value, null . 还要考虑使用Arrays.fill()来取代默认值null

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;
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM