我使用這個刪除JTable
的所有行:刪除JTable中的所有行咬了它的足跡依然
myTableModel.getDataVector().removeAllElements();
myTableModel.setRowCount(0);
但刪除後,其足跡遺蹟!請檢查此屏幕截圖:
這隻發生在我刪除所有行時,如果連一行都會出現bo問題!
爲什麼會發生這種情況?我該如何解決它?
感謝
我使用這個刪除JTable
的所有行:刪除JTable中的所有行咬了它的足跡依然
myTableModel.getDataVector().removeAllElements();
myTableModel.setRowCount(0);
但刪除後,其足跡遺蹟!請檢查此屏幕截圖:
這隻發生在我刪除所有行時,如果連一行都會出現bo問題!
爲什麼會發生這種情況?我該如何解決它?
感謝
使用DefaultTableModel
,你唯一的選擇是使用由模型所提供的功能,removeRow
removeRow
會火,告訴它需要更新自身JTable
需要相應的事件。該表具有這樣走了優化,提高了塗裝工藝
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);
}
}
}
}
呃......不,不需要什麼在DefaultTableModel中循環:setRowCount(0)是使用的方法。順便說一句,在自定義模型中,你不會觸發dataChanged:如你所知道發生了什麼(全部刪除),rowsDeleted將是最合適的。 – kleopatra 2013-04-25 07:43:34
1-顯示我多久使用'DefaultTableModel' 2-我只是懶惰:P - 更正(這是對的,我很害怕你)) – MadProgrammer 2013-04-25 09:29:54
你已經夠遠了
不太明白你的意思 - 但是:因爲它改變下模型的腳底層的數據結構(這可能會或不會導致不通知不使用第一線** **過它的聽衆正確) – kleopatra 2013-04-24 21:58:27
@kleopatra:我的意思是當我刪除像這樣的行時,UI不會更新!無論如何,我通過在刪除後調用myTable.updateUI();來修復它;如果這種方法是錯誤的,我怎樣才能清除'JTable';我認爲用'model.removeRow(i)'逐行刪除是低效率的;不是嗎? – RYN 2013-04-24 22:04:12
當然,它沒有更新,模型如何知道你已經從內部結構中刪除了所有的數據?你應該使用removeRow來代替 – MadProgrammer 2013-04-24 22:19:53