我有一个带有listselectionlistener的jtable我可以动态地将新行添加到我的表中,当我选择行时,所选行内容将出现在文本框中我能够编辑和删除数据,对于我的应用程序我将表数据存储到xml文件中,当我添加新行时,将成功添加到表中。但当我选择一行并更新意味着表没有得到更新(这里我称之为加载表())。(但更新的值在xml文件中正确更改) 这是我创建表*
的示例代码 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();
}
});
我像这样加载表格内容
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)
问题是,当我更新我的表内容时,我会调用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)
答案 0 :(得分:8)
旧故事:如果有达到目标的高级api,永远不要使用较低级别的api。或许是一个相关的故事:一遍又一遍地阅读api文档: - )
对于DefaultTableModel,删除所有行的高级API是:
model.setRowCount(0);
修改强>
查看您的堆栈跟踪,错误不是由删除引起的,而是通过访问新添加的行..我的(随机,没有看到更多或您的代码:-)猜测将是rowIndex lead
in
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();
}
}));
}
答案 1 :(得分:5)
例如
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);
}
}
答案 2 :(得分:0)
这将完成任务
DefaultTableModel dm = (DefaultTableModel)table.getModel();
dm.getDataVector().removeAllElements();
dm.fireTableDataChanged();
要使其工作,您需要创建这样的表
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));
答案 3 :(得分:0)
这很简单:只需这样做:
DefaultTableModel model = (DefaultTableModel)table.getModel();
while(model.getRowCount() > 0){
for(int i = 0 ; i < model.getRowCount();i++){
model.removeRow(i);
}
}