2013-04-24 56 views
0

我使用這個刪除JTable的所有行:刪除JTable中的所有行咬了它的足跡依然

myTableModel.getDataVector().removeAllElements(); 
myTableModel.setRowCount(0); 

但刪除後,其足跡遺蹟!請檢查此屏幕截圖:
JTable after deletion

這隻發生在我刪除所有行時,如果連一行都會出現bo問題!
爲什麼會發生這種情況?我該如何解決它?
感謝

+1

不太明白你的意思 - 但是:因爲它改變下模型的腳底層的數據結構(這可能會或不會導致不通知不使用第一線** **過它的聽衆正確) – kleopatra 2013-04-24 21:58:27

+0

@kleopatra:我的意思是當我刪除像這樣的行時,UI不會更新!無論如何,我通過在刪除後調用myTable.updateUI();來修復它;如果這種方法是錯誤的,我怎樣才能清除'JTable';我認爲用'model.removeRow(i)'逐行刪除是低效率的;不是嗎? – RYN 2013-04-24 22:04:12

+0

當然,它沒有更新,模型如何知道你已經從內部結構中刪除了所有的數據?你應該使用removeRow來代替 – MadProgrammer 2013-04-24 22:19:53

回答

1

使用DefaultTableModel,你唯一的選擇是使用由模型所提供的功能,removeRow

removeRow會火,告訴它需要更新自身JTable需要相應的事件。該表具有這樣走了優化,提高了塗裝工藝

enter image description hereenter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 

public class TestTable { 

    public static void main(String[] args) { 
     new TestTable(); 
    } 

    public TestTable() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       DefaultTableModel model = new DefaultTableModel(); 
       JTable table = new JTable(model); 
       for (int index = 0; index < 10; index++) { 
        model.addColumn(index); 
       } 
       for (int row = 0; row < 1000; row++) { 
        String[] values = new String[10]; 
        for (int col = 0; col < 10; col++) { 
         values[col] = row + "x" + col; 
        } 
        model.addRow(values); 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(table)); 
       frame.add(new JButton(new DeleteRowsFromDefaultModel(model)), BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class DeleteRowsFromDefaultModel extends AbstractAction { 

     private final DefaultTableModel model; 

     public DeleteRowsFromDefaultModel(DefaultTableModel model) { 
      this.model = model; 
      putValue(NAME, "Delete All"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      model.setRowCount(0); 
     } 

    } 

} 

如果你真的擔心性能,你需要創建自己的模型,並創建自己的clear方法引發適當的事件。

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableModel; 

public class TestTable1 { 

    public static void main(String[] args) { 
     new TestTable1(); 
    } 

    public TestTable1() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       MyTabelModel model = new MyTabelModel(); 
       JTable table = new JTable(model); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(table)); 
       frame.add(new JButton(new DeleteRowsFromMyModel(model)), BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class DeleteRowsFromMyModel extends AbstractAction { 

     private final MyTabelModel model; 

     public DeleteRowsFromMyModel(MyTabelModel model) { 
      this.model = model; 
      putValue(NAME, "Delete All"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      model.clear(); 
     } 
    } 

    public class MyTabelModel extends AbstractTableModel { 

     private List<String[]> rows; 

     public MyTabelModel() { 
      rows = new ArrayList<>(1000); 
      for (int row = 0; row < 1000; row++) { 
       String[] values = new String[10]; 
       for (int col = 0; col < 10; col++) { 
        values[col] = row + "x" + col; 
       } 
       rows.add(values); 
      } 
     } 

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

     @Override 
     public int getColumnCount() { 
      return 10; 
     } 

     @Override 
     public String getColumnName(int column) { 
      return String.valueOf(column); 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      String[] row = rows.get(rowIndex); 
      return row[columnIndex]; 
     } 

     public void clear() { 
      int old = getRowCount(); 
      if (old > 0) { 
       rows.clear(); 
       fireTableRowsDeleted(0, old - 1); 
      } 
     } 
    } 
} 
+0

呃......不,不需要什麼在DefaultTableModel中循環:setRowCount(0)是使用的方法。順便說一句,在自定義模型中,你不會觸發dataChanged:如你所知道發生了什麼(全部刪除),rowsDeleted將是最合適的。 – kleopatra 2013-04-25 07:43:34

+0

1-顯示我多久使用'DefaultTableModel' 2-我只是懶惰:P - 更正(這是對的,我很害怕你)) – MadProgrammer 2013-04-25 09:29:54

+1

你已經夠遠了 kleopatra 2013-04-25 09:40:32