我在这里尝试的是,当我在表格中选择一行时,在加载数据后,它应该在文本字段中显示所选行的值(selectedRowTF)。但是一旦我点击jButton,就会产生以下错误 -
java.lang.ArrayIndexOutOfBoundsException:-1
由于甚至在加载数据之前就会发生错误,所以我甚至没有机会选择一行。
您是否也认为我使用正确的代码来获取行的值?
DefaultTableModel model;
model=(DefaultTableModel)tbl.getModel();
try {
Class.forName("java.sql.Driver");
Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/divign","root","password");
Statement stmt=con.createStatement();
int row=tbl.getSelectedRow();
String rowSelected=(tbl.getModel().getValueAt(row, 0).toString());
String query="SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = '"+customerIdTF.getText()+"' ;";
ResultSet rs=stmt.executeQuery(query);
if(rs.next()) {
model.addRow (new Object[ ] {
rs.getInt(1),rs.getString(2),rs.getString(3)
});
selectedRowTF.setText(""+rowSelected);
}
rs.close();
stmt.close();
con.close();
}
catch(Exception e){
JOptionPane.showMessageDialog(null,e.toString());
}
答案 0 :(得分:0)
如果您只是加载数据,tbl.getSelectedRow()
会返回-1
。
之后,您尝试获取无效行的第一列的字符串值。
String rowSelected=(tbl.getModel().getValueAt(row, 0).toString());
=> getValueAt
导致您的例外。
尝试以下方法:
String rowSelected = "";
if(row != -1)
{
rowSelected = tbl.getModel().getValueAt(row, 0).toString();
}
EDIT 正如您所说,您只想获取所选值,代码的位置是错误的。
您正在尝试在加载数据时获取所选行的值。但那时候你不会选择一行。 我认为你需要这样的东西(在桌面点击鼠标时打印出值):
tbl.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
int row = table.getSelectedRow();
if (row > -1) {
String value = (table.getModel().getValueAt(row, 0).toString());
System.out.println("Value of row " + row + " col 0: '" + value + "'");
selectedRowTF.setText(value);
} else {
System.out.println("Invalid selection");
}
}
});
或者您可以点击按钮对选择做出反应:
private void btClickActionPerformed(java.awt.event.ActionEvent evt) {
int row = table.getSelectedRow();
if (row > -1) {
String value = (table.getModel().getValueAt(row, 0).toString());
System.out.println("Value of row " + row + " col 0: '" + value + "'");
selectedRowTF.setText(value);
} else {
System.out.println("Invalid selection");
}
}
答案 1 :(得分:0)
您的情况是,当您致电tbl.getSelectedRow()
时,它返回-1
。这是一个标记值,表示没有选择行。当鼠标单击它时,或者当键盘将选择移动到该行时,将选择一行。当没有选择行时,您将需要处理这种情况。我不知道你的要求和目标,所以我无法就如何做到这一点提出建议。如果希望在选择更改并对其作出反应时收到通知,则可以使用JTable注册选择侦听器。 (请参阅getSelectionModel
,addListSelectionListener
和ListSelectionListener
)
如果你没有在JTable上启用排序或过滤,你可能会在没有处理它的情况下离开,但值得知道视图(JTable
)中的行索引是模型(DefaultTableModel
)中的索引不同。使用convertRowIndexToModel
方法将视图的索引(由getSelectedRow()
报告)转换为模型的索引(getValueAt()
所需)。
您发布的代码还包含SQL注入问题。我建议您研究该主题,并使用PreparedStatement
和setString()
进行修复。