java - 更新记录时数组越界异常
问题描述
我创建了一个简单的地址簿程序,它允许用户添加和更新记录。通讯录上还有一个jtable,向用户显示通讯录中的所有记录。我最近添加了用户更新现有记录和表刷新的逻辑。但是,如果我然后单击更新的记录或 Jtable 中的任何记录以显示到 Jtext 字段中,我会收到一个数组超出范围错误。
从数据库中获取记录的代码
public void addTable() throws Exception {
tableModel = new DefaultTableModel();
xtable = new JTable(tableModel);
tableModel.addColumn("ID");
tableModel.addColumn("First Name");
tableModel.addColumn("Surname");
tableModel.addColumn("Address Line 1");
tableModel.addColumn("Address Line 2");
tableModel.addColumn("Address Line 3");
tableModel.addColumn("City");
tableModel.addColumn("Post Code");
tableModel.addColumn("Email Address");
tableModel.addColumn("Phone Number");
db.connectDb();
String outQuery = "SELECT * FROM Contacts";
db.myFs = db.st.executeQuery(outQuery);
while (db.myFs.next()) {
String id = db.myFs.getString("ContactID");
String fName = db.myFs.getString("FirstName");
String sName = db.myFs.getString("Surname");
String adOne = db.myFs.getString("AddressLineOne");
String adTwo = db.myFs.getString("AddressLineTwo");
String adThree = db.myFs.getString("AddressLineThree");
String cCity = db.myFs.getString("City");
String pCode = db.myFs.getString("PostCode");
String eAddress = db.myFs.getString("EmailAddress");
String eName = db.myFs.getString("PhoneNumber");
tableModel.insertRow(0, new Object[] { id, fName,sName, adOne, adTwo, adThree, cCity,
pCode, eAddress, eName });
}
db.st.close();
db.con.close();
pane = new JScrollPane(xtable);
pane.setBounds(700, 100, 400, 100);
panel.add(pane);
}
将记录显示到 JTextField 中的代码
public void fetchRec() {
xtable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
String col0 = (String) xtable.getValueAt(xtable.getSelectedRow(),0);
String col1 = (String) xtable.getValueAt(xtable.getSelectedRow(),1);
String col2 = (String) xtable.getValueAt(xtable.getSelectedRow(),2);
String col3 = (String) xtable.getValueAt(xtable.getSelectedRow(),3);
String col4 = (String) xtable.getValueAt(xtable.getSelectedRow(),4);
String col5 = (String) xtable.getValueAt(xtable.getSelectedRow(),5);
String col6 = (String) xtable.getValueAt(xtable.getSelectedRow(),6);
String col7 = (String) xtable.getValueAt(xtable.getSelectedRow(),7);
String col8 = (String) xtable.getValueAt(xtable.getSelectedRow(),8);
String col9 = (String) xtable.getValueAt(xtable.getSelectedRow(),9);
idLabelField.setText(col0);
firstNameLabelField.setText(col1);
surNameLabelField.setText(col2);
addressLineOneField.setText(col3);
addressLineTwoField.setText(col4);
addressLineThreeField.setText(col5);
cityField.setText(col6);
postCodeField.setText(col7);
emailAddressField.setText(col8);
phoneNumberField.setText(col9);
}
});
}
更新数据库中记录的代码
public void updateButton() {
updateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
number = Integer.parseInt(idLabelField.getText());
setID(number);
setFirstName(firstNameLabelField.getText());
setSurName(surNameLabelField.getText());
setAddressLineOne(addressLineOneField.getText());
setAddressLineTwo(addressLineTwoField.getText());
setAddressLineThree(addressLineThreeField.getText());
setCity(cityField.getText());
setPostCode(postCode.getText());
setEmailAddress(emailAddressField.getText());
setPhoneNumber(phoneNumberField.getText());
try {
db.updateDB(getID(),getFirstName(), getSurName(), getAddressLineOne(), getAddressLineTwo(),
getAddressLineThree(), getCity(), getPostCode(), getEmailAddress(), getPhoneNumber());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
addTable();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
我得到的错误是线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8
解决方案
首先不要使用空布局和 setBounds()。Swing 被设计用于布局管理器。
我最近添加了用户更新现有记录和表刷新的逻辑。
我猜问题是您不断创建新组件(即 JTable 和 JScrollPane),然后将组件添加到屏幕上。
问题是您永远不会删除以前的组件,因此您在框架上绘制了每个组件的多个实例,并且您的变量不引用可见组件。
因此,解决方案是在您首次创建框架时创建JTable
并JScrollPane
添加组件到框架中。然后,当您“引用”数据时,您只需创建一个新数据DefaultTableModel
并使用该setModel(...)
方法更新表。
或者您可以使用setRowCount(0)
您的 currentDefaultTableModel
删除所有当前数据,然后使用该addRow(...)
方法使用 ResultSet 中的 dat 重新填充模型。
推荐阅读
- javascript - Javasript :TypeError: input.value 未定义
- python-3.x - 对象的比较方法
- reactjs - 在 redux-saga 中获取 api 数据
- javascript - React redux - 在提供程序之外的 App.js 中分派?
- kotlin - 如何使用 kotlinx 序列化使用 open val 序列化 kotlin 密封类
- typescript - 打字稿:对象分配不按预期工作
- android - 如何让aab格式支持更多设备
- azure-devops - 使用个人访问令牌将 Azure DevOps 部署到 VM
- c# - 如何将逗号分隔的单词拆分然后加入字符串以创建条件?
- angular - 按顺序对多个文件进行角度测试 - 等待量角器与页面同步时出错