【问题标题】:How to clear a JTable contents after pressing a JButton ?按下 JButton 后如何清除 JTable 内容?
【发布时间】:2013-02-08 09:49:29
【问题描述】:

在我的程序中有一个 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);

//它获取数据库并retribes材料名称和单位。然后将其设置为相应的列。

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

请在这方面向我提出建议。 当单击“刷新”按钮时,我有另一个选项,它将通过处理最后一个来调用框架本身。这是一个好习惯吗?建议。

【问题讨论】:

  • 不相关:a) 永远不要手动调整组件的大小/定位 b) 永远不要通过 setXXSize 调整组件的大小提示而是使用合适的 LayoutManager
  • 不确定您所说的“清除”是什么意思。如果您的意思是从模型中删除所有数据行,那么您可以使用 DefaultTableModel。要清除模型,您可以使用 setRowCount(0) 方法。

标签: java swing jtable


【解决方案1】:

正如here 所讨论的,删除需要更新模型的内部数据结构。一种权宜之计是简单地为一些行和列创建数组:

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

还可以考虑将Arrays.fill() 替换为默认值null

【讨论】:

    【解决方案2】:
    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;
      }
    

    【讨论】:

    • 我不确定这正是 OP 想要的。而不是删除行,它只是将值清空,这可能不适合每个单元格......
    • 还需要触发一个合适的TableModelEvent
    • 意味着我必须明确清除 JTable。有没有预定义的方法?
    • @trashgod,我不确定为什么在使用 setValueAt(...) 方法时需要触发 TableModelEvent。表 setValueAt() 方法将调用模型 setValueAt() 方法,该方法又将调用 fireTableCellUpdated。
    • @camickr:哎呀,你是对的;感谢您的评论。这可能会暴露这种方法的局限性:它将触发 numberOfRows * numberOfColumns 事件。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多