2013-02-08 39 views
0

在我的程序中有一個名爲「保存」和「刷新」的JTable和2個按鈕。 我的程序概述:如何在按JButton後清除JTable內容?

讓我們手工輸入10行到JTable。 比我更新這些數據到數據庫通過點擊「保存」按鈕。現在

我的觀點是:

當「刷新」按鈕被點擊,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被intialised以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){

請給我建議在這方面 我時,另一種選擇。」刷新」按鈕,點擊它會調用幀本身通過佈置最後的。它是很好的做法,怎麼辦?建議。

+0

無關:a)不做任何手動調整/定位組件,永遠b)永遠不會調整組件的大小提示[setXXSize](http://stackoverflow.com/a/7229519/203657)相反,使用合適的LayoutManager – kleopatra

+0

不清楚「clear」是什麼意思。如果你的意思是從模型中刪除所有的數據行,那麼你可以使用DefaultTableModel。要清除模型,可以使用setRowCount(0)方法。 – camickr

回答

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

我不確定這是什麼OP需要。而不是刪除行,它只是將值置零,這可能不適合每個單元格... – MadProgrammer

+1

還需要激發一個合適的'TableModelEvent'。 – trashgod

+0

意味着我必須明確清除JTable。有沒有預定義的方法? – Praful

2

正如所討論的here,去除需要更新模型的內部數據結構。一個權宜的方法是簡單地創造吃了一些行數和列的排列:

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

還要考慮Arrays.fill()以取代默認值,null