2012-09-08 43 views
2

我一直的JTable一個子類,使用自定義表模型(的AbstractTableModel實現)來管理數據。刪除行從JTable中自定義表格模型

的問題,當我試圖刪除一行與方法deleteRow發生。我的表中的行被替換爲空白字符串,但行未被刪除。

下面是代碼:

public class LiveSearchTableModel extends AbstractTableModel 
{ 

    private List<String> columnNames = new ArrayList<String>(); 
    private Map<Point, Object> displayData = new HashMap<Point, Object>(); 
    private Map<Point, Object> originalData = new HashMap<Point, Object>(); 

    public LiveSearchTableModel(List<String> columnNames, 
     Map<Point, Object> tableData) 
    { 
    this.columnNames = columnNames; 
    this.displayData = tableData; 
    this.originalData.putAll(tableData); 
    } 

    @Override 
    public int getColumnCount() { 
    return columnNames.size(); 
    } 

    @Override 
    public int getRowCount() { 
    return displayData.size()/columnNames.size(); 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
    return displayData.get(new Point(rowIndex, columnIndex)); 
    } 

    public void deleteRow (int row) 
    { 
    for (int cont = 0; cont < columnNames.size();cont++) 
    { 
     displayData.remove(new Point (row,cont)); 
    } 

    this.fireTableRowsDeleted(row, row); 
    } 

    @Override 
    public void setValueAt(Object value, int rowIndex, int columnIndex) 
    { 
    this.displayData.put(new Point(rowIndex, columnIndex), value); 
    this.fireTableDataChanged(); 
    } 
} 
+3

你能編輯你的代碼示例來提供一個[SSCCE](http://sscce.org/),我們可以執行和試驗嗎? –

+0

並不是那麼簡單。我嘗試做到這一點!謝謝 – Luca

+1

它比你想象的要容易得多。只是一個測試JFrame與一張桌子,一個按鈕和一些人口日期。它不需要漂亮。有時你會發現答案就是創建一個SSCCE。 –

回答

3

sscce下面示出了一個潛在的問題:一個Map的鍵是不排序,而表的行是。在所示的方法中,必須通過對數據的每次更改來更新密鑰數組。另請參閱此相關的example。如果需要,你可以擴展Point實施Comparable,爲Value所示here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

/** 
* @see https://stackoverflow.com/q/12330167/230513 
*/ 
public class TableModelTest extends JPanel { 

    public TableModelTest() { 
     super(new BorderLayout()); 
     final MyModel model = new MyModel(); 
     JTable table = new JTable(model); 
     this.add(new JScrollPane(table)); 
     this.add(new JButton(new AbstractAction("Delete") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       model.remove(0); 
      } 
     }), BorderLayout.SOUTH); 
    } 

    public class MyModel extends AbstractTableModel { 

     private List<String> names = new ArrayList<String>(); 
     private Map<Point, Object> data = new HashMap<Point, Object>(); 
     private Point[] keys; 

     public MyModel() { 
      this.names = Arrays.asList("Point", "Name"); 
      data.put(new Point(1, 1), "One"); 
      data.put(new Point(2, 2), "Two"); 
      data.put(new Point(3, 3), "Three"); 
      this.keys = data.keySet().toArray(new Point[data.size()]); 
     } 

     public void remove(int row) { 
      data.remove(keys[row]); 
      keys = data.keySet().toArray(new Point[data.size()]); 
      this.fireTableRowsDeleted(row, row); 
     } 

     @Override 
     public int getColumnCount() { 
      return names.size(); 
     } 

     @Override 
     public String getColumnName(int col) { 
      return names.get(col); 
     } 

     @Override 
     public int getRowCount() { 
      return data.size(); 
     } 

     @Override 
     public Object getValueAt(int row, int col) { 
      if (col == 0) { 
       return keys[row]; 
      } else { 
       return data.get(keys[row]); 
      } 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("TableModelTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TableModelTest().display(); 
      } 
     }); 
    } 
} 
+0

指出的問題,如果你有一個'Point'實現'Comparable',對於[示例](http://users.dickinson.edu/~braught去/courses/cs132s02/classes/code/Point.src.html),你可以使用'TreeMap'而不是'HashMap'。 – trashgod

+0

感謝您的回覆。我知道你已經強調了一個事實,即使用HashMap,訂單可能會有問題。在我的情況下,順序是好的,但你有什麼想法,當我刪除時,我在表中有一個空白行的原因?謝謝! – Luca

+0

對不起,沒有什麼突出的;你可能會尋找一個'null'鍵並檢查'put()'和'remove()'的返回值,尋找意外的結果。 – trashgod

相關問題