问题
I have a JButton
which, once it is pressed, adds a row into a JTable
. I have tried to make this by implementing the following code.
columNames = new Vector<>();
columNames.addElement("Name");
columNames.addElement("CC");
columNames.addElement("Age");
columNames.addElement("PhoneNumber");
columNames.addElement("Date");
columNames.addElement("Amount$");
Object[] dataList = {"name", "cc", "age", "phone", "date", "amount"};
data = new DefaultTableModel(columNames, 0);
data.addRow(dataList);
table = new JTable(data);
JScrollPane scrollTable = new JScrollPane(table);
scrollTable.setBounds(22, 78, 764, 177);
scrollTable.setViewportView(table);
//ActionListener method!.
if(e.getActionCommand().equals("Add client"))
{
Object[] dataList = {"name", "cc", "age", "phone", "date", "amount"};
data.addRow(dataList);
DefaultTableModel defaut = (DefaultTableModel) table.getModel();
defaut.addRow(dataList);
}
It throws Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException
:-1
How can I solve it?
回答1:
As shown in the complete example below, your fragments appear to work correctly. The example may help you isolated the problem in your full code. In addition,
Instead of
setBounds()
, overridegetPreferredScrollableViewportSize()
to return a multiple ofgetRowHeight()
, as suggested here, andpack()
the enclosing window.See also What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?
As suggested here, repeated failures to update the
TableModel
suggests that you may be referencing an unintended instance of an object.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
* @see https://stackoverflow.com/a/38926460/230513
*/
public class Test {
private final Object[] dataList = {"name", "cc", "age", "phone", "date", "amount"};
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Vector columNames = new Vector<>();
columNames.addElement("Name");
columNames.addElement("CC");
columNames.addElement("Age");
columNames.addElement("Phone");
columNames.addElement("Date");
columNames.addElement("Amount$");
DefaultTableModel data = new DefaultTableModel(columNames, 0);
data.addRow(dataList);
JTable table = new JTable(data);
JScrollPane scrollTable = new JScrollPane(table);
scrollTable.setViewportView(table);
f.add(new JScrollPane(table));
f.add(new JButton(new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent e) {
data.addRow(dataList);
}
}), BorderLayout.PAGE_END);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
}
来源:https://stackoverflow.com/questions/38926148/error-adding-row-into-jtable