在 jTable 中选择一行会产生错误
Posted
技术标签:
【中文标题】在 jTable 中选择一行会产生错误【英文标题】:Selecting a row in jTable generates error 【发布时间】:2016-03-16 02:01:04 【问题描述】:我在这里尝试做的是,当我在表中选择一行时,加载数据后,它应该在文本字段 (selectedRowTF) 中显示所选行的值。但是只要我点击 jButton 就会生成以下错误 -
java.lang.ArrayIndexOutOfBoundsException: -1
由于甚至在加载数据之前就发生错误,因此我什至没有机会选择一行。
您还认为我使用正确的代码来获取行的值吗?
Stack Trace
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());
【问题讨论】:
你应该在你的问题中提供堆栈跟踪,而不是链接到谷歌文档。我无法从此处访问 google 文档,以后可能无法使用它来帮助其他人找到答案。 【参考方案1】:如果您只是加载数据,tbl.getSelectedRow()
将返回 -1
。
之后,您尝试获取无效行的第一列的字符串值。
String rowSelected=(tbl.getModel().getValueAt(row, 0).toString());
=> getValueAt
导致您的异常。
尝试以下方法:
String rowSelected = "";
if(row != -1)
rowSelected = tbl.getModel().getValueAt(row, 0).toString();
编辑 正如你所说的你只是想得到选择的值,你的代码的位置是错误的。
您正试图在加载数据时获取所选行的值。但那时你没有选择一行。 我认为您需要类似的东西(在表格上单击鼠标即可打印出值):
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");
【讨论】:
我在 CustomerIdTF 中输入“1”,这是我表中的第一条记录...不仅仅是加载数据...抱歉,如果您的意思是别的,请为我澄清一下跨度> ......正如我之前所说,即使在加载数据之前,只要我点击我的按钮,就会发生错误,因此询问行是无关紧要的。 只是想要求堆栈跟踪或类似的东西,以便我可以帮助您找到错误...使用堆栈跟踪,您可以确定发生错误的确切行,所以它会是轻松找到解决问题的方法 我在帖子中提供了一个链接。 你已经尝试过我的建议了吗?错误发生在“getValueAt”函数中。请替换您的“ String rowSelected=(tbl.getModel().getValueAt(row, 0).toString());”用我的解决方案告诉我它是否有效。【参考方案2】:您的情况是,当您调用tbl.getSelectedRow()
时,它返回了-1
。这是一个标记值,表示没有选择任何行。当鼠标单击某行或键盘将选择移至该行时,该行被选中。当没有选择行时,您将需要处理这种情况。我不知道你的要求和目标,所以我不能建议如何做到这一点。如果您想在选择更改时收到通知并对其做出反应,您可以向 JTable 注册选择侦听器。 (见getSelectionModel
、addListSelectionListener
和ListSelectionListener
)
如果您没有在 JTable 上启用排序或过滤,您可能无需处理它,但是值得知道 视图 (JTable
) 中的行索引不是model (DefaultTableModel
) 中的相同索引。使用convertRowIndexToModel
方法将视图的索引(由getSelectedRow()
报告)转换为模型的索引(由getValueAt()
要求)。
您发布的代码还包含 SQL 注入问题。我建议研究该主题,并使用PreparedStatement
和setString()
修复它。
【讨论】:
以上是关于在 jTable 中选择一行会产生错误的主要内容,如果未能解决你的问题,请参考以下文章