Java 如何删除jtable中的所有行?
我有一个带有listselectionlistener的jtable,我可以动态地将新行添加到我的表中,当我选择行时,所选行内容将显示在文本框中,我可以编辑和删除数据,对于我的应用程序,我将表数据存储到xml文件中,当我添加新行时,将成功地添加到表中。但当我选择一行并进行更新时,意味着表不会得到更新(这里我称之为load table())(但更新后的值在xml文件中正确地更改了) 这是我创建表的示例代码*Java 如何删除jtable中的所有行?,java,swing,jtable,actionlistener,selectionmodel,Java,Swing,Jtable,Actionlistener,Selectionmodel,我有一个带有listselectionlistener的jtable,我可以动态地将新行添加到我的表中,当我选择行时,所选行内容将显示在文本框中,我可以编辑和删除数据,对于我的应用程序,我将表数据存储到xml文件中,当我添加新行时,将成功地添加到表中。但当我选择一行并进行更新时,意味着表不会得到更新(这里我称之为load table())(但更新后的值在xml文件中正确地更改了) 这是我创建表的示例代码* ListSelectionModel selectionModel; JT
ListSelectionModel selectionModel;
JTable table1;
model = new DefaultTableModel();
table = new JTable(model); table.setRowHeight(20);
selectionModel = table.getSelectionModel();
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
selectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
stxtBox.setText("");
ptxtBox.setText("");
ntxtBox.setText("");
if (!e.getValueIsAdjusting()) {
model1 = table.getSelectionModel();
int lead = model1.getLeadSelectionIndex();
int columns = table.getColumnCount();
String sip = "";
String sport = "";
String snoq = "";
for (int col = 0; col < columns; col++) {
Object o = table.getValueAt(lead, col);
if (col == 0) {
sip += o.toString();
stxtBox.setText(sip);
selectedip = sip;
} else if (col == 1) {
sport += o.toString();
ptxtBox.setText(sport);
selectedport = sport;
} else {
snoq += o.toString();
ntxtBox.setText(snoq);
}
selectedreq = snoq;
}
}table.clearSelection();
}
});
问题是当我更新我的表内容时,每当我遇到这个错误时,我都会调用loadtable()函数
java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
at javax.swing.JTable.getValueAt(Unknown Source)
at Testsample$18.valueChanged(Testsample.java:1810)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.insertIndexInterval(Unknown Source)
at javax.swing.JTable.tableRowsInserted(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at Testsample.loadtable(Testsample.java:577)
at Testsample$10.actionPerformed(Testsample.java:1551)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
比如说
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);
}
}
这将完成任务
DefaultTableModel dm = (DefaultTableModel)table.getModel();
dm.getDataVector().removeAllElements();
dm.fireTableDataChanged();
要使其工作,您需要创建如下表
int rowCount=0;
File file = new File("serverconfig.xml");
if (file.exists())
{
System.out.print("in load");
int e = table.getRowCount();
if(e> 0)
{
while (table.getRowCount() > 0) {
((DefaultTableModel) table.getModel()).removeRow(0);
}
}
//here i will load table content from my xml file (that's working fine)
String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
Object[][] data = {
{"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false)},
{"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
};
JTable jTable = new JTable();
jTable.setModel(new DefaultTableModel(data,columnNames));
老话说得好:如果有高级api来达到目标,就永远不要使用低级api。或者一个相关的故事:反复阅读api文档:-) 对于DefaultTableModel,删除所有行的高级api为:
model.setRowCount(0);
编辑
查看stacktrace,该错误不是由删除引起的,而是由访问新添加的行引起的。。我(随机,没有看到更多或您的代码:-)猜测将是中的行索引lead
Object o = table.getValueAt(lead, col);
您必须检查其是否有效,可能为负(无潜在客户)或仍然是旧的(添加之前的索引)。请注意,选择状态是由于在tableModel中添加/删除数据(以及通过用户交互)而更新的这里的重要规则是确保在访问客户机代码中的任何状态之前,在模型更改之后更新表的内部。可以通过将其包装在invokeLater中来实现:
void updateTextBox() {
if (selectionModel.getLeadSelectionIndex() >= table.getRowCount() ||
selectionModel.getLeadSelectionIndex() < 0) return;
.... // update text panel here
}
public void valueChanged(...) {
if (e.getValueIsAdjusting()) return;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
updateTextBox();
}
}));
}
void updateTextBox(){
if(selectionModel.getLeadSelectionIndex()>=table.getRowCount()||
selectionModel.getLeadSelectionIndex()<0)返回;
..//此处更新文本面板
}
公共无效值已更改(…){
if(如getValueIsAdjusting())返回;
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
updateTextBox();
}
}));
}
非常简单:只需执行以下操作:
DefaultTableModel model = (DefaultTableModel)table.getModel();
while(model.getRowCount() > 0){
for(int i = 0 ; i < model.getRowCount();i++){
model.removeRow(i);
}
}
DefaultTableModel=(DefaultTableModel)table.getModel();
而(model.getRowCount()>0){
对于(int i=0;i
-1否:永远不要更改模型底部的数据结构-即使您至少触发了一个事件(虽然不是正确的将被删除的行)。您不需要在循环周围删除if块-如果rowCount==0,它无论如何也不会启动:-)循环本身是错误的(因为存在要删除的api),嵌套循环(当单个循环正确完成时就足够了)只是。。。奇怪的是,有api可以删除所有api并没有导致循环错误。这是错误的,因为它用不必要的代码污染了代码空间:每个代码的维护者都会挠头,试图找到你没有立即执行的隐藏原因。。如果找不到它,他们就不会碰它,更糟糕的是,他们甚至会把它复制到其他地方。for的走错了方向:您将删除第0行,因此第1行将成为第0行,但随后i++
则删除第2行,等等。我想这就是为什么您在期间添加了额外的。。。对
循环使用反向,就像@mKorbel在他的例子中所做的那样,或者更好地使用removeAll()
,就像@kleopatra建议的那样;)@Matthieu重复(我的回答,评论有点离题:-)只是为了记录:“rmoveAll”的api有点不自然<代码>设置行数(0)
:-)