2012-05-02 65 views
13

我想刪除DefaultTable的所有行。我發現了兩種常見的方法在Internet上刪除它們,但它們都不起作用,因爲這些方法在我的DefaultTableModel中不存在。想知道爲什麼:S。使用DefaultTableModel的代碼是Java:刪除DefaultTableModel的所有行

DefaultTableModel Table =(DefaultTableModel)Table.getModel();刪除

的一種方式是

Table.removeRow(Table.getRowCount() - 1);

但是這個removerow方法在我的DefaultTableModel中不存在。

請幫我一把。

回答

8

爲什麼簡單的事情複雜化,但是移除一定是反覆的,

if (myTableModel.getRowCount() > 0) { 
    for (int i = myTableModel.getRowCount() - 1; i > -1; i--) { 
     myTableModel.removeRow(i); 
    } 
} 

代碼示例

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.table.*; 

public class RemoveAddRows extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private Object[] columnNames = {"Type", "Company", "Shares", "Price"}; 
    private Object[][] data = { 
     {"Buy", "IBM", new Integer(1000), new Double(80.50)}, 
     {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)}, 
     {"Sell", "Apple", new Integer(3000), new Double(7.35)}, 
     {"Buy", "Nortel", new Integer(4000), new Double(20.00)} 
    }; 
    private JTable table; 
    private DefaultTableModel model; 

    public RemoveAddRows() { 

     model = new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Class getColumnClass(int column) { 
       return getValueAt(0, column).getClass(); 
      } 
     }; 
     table = new JTable(model) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       int firstRow = 0; 
       int lastRow = table.getRowCount() - 1; 
       int width = 0; 
       if (row == lastRow) { 
        ((JComponent) c).setBackground(Color.red); 
       } else if (row == firstRow) { 
        ((JComponent) c).setBackground(Color.blue); 
       } else { 
        ((JComponent) c).setBackground(table.getBackground()); 
       } 
       /*if (!isRowSelected(row)) { 
       String type = (String) getModel().getValueAt(row, 0); 
       c.setBackground("Buy".equals(type) ? Color.GREEN : Color.YELLOW); 
       } 
       if (isRowSelected(row) && isColumnSelected(column)) { 
       ((JComponent) c).setBorder(new LineBorder(Color.red)); 
       }*/ 
       return c; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
     JButton button1 = new JButton("Remove all rows"); 
     button1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       if (model.getRowCount() > 0) { 
        for (int i = model.getRowCount() - 1; i > -1; i--) { 
         model.removeRow(i); 
        } 
       } 
       System.out.println("model.getRowCount() --->" + model.getRowCount()); 
      } 
     }); 
     JButton button2 = new JButton("Add new rows"); 
     button2.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)}; 
       model.addRow(data0); 
       Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)}; 
       model.addRow(data1); 
       Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)}; 
       model.addRow(data2); 
       Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)}; 
       model.addRow(data3); 
       System.out.println("model.getRowCount() --->" + model.getRowCount()); 
      } 
     }); 
     JPanel southPanel = new JPanel(); 
     southPanel.add(button1); 
     southPanel.add(button2); 
     add(southPanel, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) { 
     RemoveAddRows frame = new RemoveAddRows(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

原因不是複雜的簡單的事情是爲了避免像你這樣做的錯誤:if語句是多餘的,它不會刪除索引0的行,並且不必要地爲每一行觸發一個事件。 –

+0

@Walter Laan感謝您提供了一個愚蠢的錯誤,其餘的我簡單的不同意,與此處的答案相同, – mKorbel

+0

-1堅持刪除循環 - 您被警告;-) – kleopatra

36

您可以設置該行從documentation數爲0 setRowCount(0)

報價:

public void setRowCount(int rowCount) 

設置模型中的行數。如果新大小大於 當前大小,則將新行添加到模型的末尾。如果 新大小小於當前大小,則索引rowCount和 以上的所有行都將被丟棄。

但你不能找到removeRow任我懷疑你沒有鍵入您模型變量爲DefaultTableModel也許,也許只是TableModel

在這種情況下,投出您TableModelDefaultTableModel這樣的:

DefaultTableModel model = (DefaultTableModel) table.getModel(); 
+0

我已經使用這個相同的類型轉換,但仍這種方法沒有按」 t存在 – Xara

+2

向我們顯示您的代碼。 –

9

你爲什麼不讀javadoc of DefaultTableModel

公共無效removeRow(INT行)

在移除從模型鱗次櫛比。被移除的行的通知將被髮送給所有聽衆。

公共無效setDataVector(向量替換dataVector, 矢量columnIdentifiers)

替換當前替換dataVector實例變量與新 向量的行,替換dataVector。

公共無效setRowCount(INT rowCount時)

設置模型中的行數。如果新大小大於 當前大小,則將新行添加到模型的末尾。如果 新大小小於當前大小,則索引rowCount和 以上的所有行都將被丟棄。

+0

爲什麼你不讀第一個問題! –

11

你有沒有試過這種 這對我的作品..

defaultTableModel.setRowCount(0); 
2

只需保持刪除表模型的第一行,直到沒有剩下的行。

// clean table 
DefaultTableModel myTableModel = (DefaultTableModel) this.myjTable.getModel(); 
while (myTableModel.getRowCount() > 0) { 
     myTableModel.removeRow(0); 
} 
0

YPU可以寫一個方法

public void clearTable() 
    { 
    getTableModel().setRowCount(0); 
    } 

然後調用從地方這種方法,你需要清檯