我正在Java Swing项目中使用Netbeans。
我正在开发搜索功能和详细的数据视图。
这些组件是JPanel
,其中包含JToggleButton
(触发搜索)a JTextField
(插入要搜索的文字)和JTable
(JScrollPane
中的最后一个}})。
在此面板下方有另一个面板,其中包含一些文本字段,这些字段在选择表格中的行时会更新。 搜索工作正常,文本字段更新,但仅适用于第一次搜索,因为我在表中选择一行,搜索按钮停止工作,表格行为不正常。
这是错误:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementData(Vector.java:734)
at java.util.Vector.elementAt(Vector.java:477)
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648)
....
我希望有人可以指出错误所在。
这是代码的一部分:
private void runQueryBasedOnName() {
executeHQLQuery(query1 + jTextField2.getText() + "%'");
}
private void executeHQLQuery(String hql) {
try {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
Query q = session.createQuery(hql);
List resultList = (List) q.list();
displayResult(resultList);
session.getTransaction().commit();
} catch (HibernateException he) {
he.printStackTrace();
}
}
private void jToggleButton3ActionPerformed(java.awt.event.ActionEvent evt) {
DefaultTableModel model1 = (DefaultTableModel) jTable1.getModel();
model1.setRowCount(0);
jTable1.repaint();
if(!jTextField2.getText().trim().equals("")) {
jTextField5.setText("");
jTextField6.setText("");
jTextField8.setText("");
jTextField7.setText("");
jTextField9.setText("");
runQueryBasedOnName();
}
}
private void displayResult(List resultList) {
Vector<String> tableHeaders = new Vector<String>();
final Vector tableData = new Vector();
tableHeaders.add("Id");
tableHeaders.add("Site name");
tableHeaders.add("SITE_LINK");
tableHeaders.add("SITE_DESC");
tableHeaders.add("Start data");
for(Object o : resultList) {
Sites sites;
sites = (Sites)o;
Vector<Object> oneRow = new Vector<Object>();
oneRow.add(sites.getSiteId());
oneRow.add(sites.getSiteName());
oneRow.add(sites.getSiteLink());
oneRow.add(sites.getSiteDesc());
oneRow.add(sites.getSiteDataIn());
tableData.add(oneRow);
}
jTable1.setModel(new DefaultTableModel(tableData, tableHeaders));
TableColumn clm= jTable1.getColumn("SITE_LINK");
clm.setMaxWidth(0);
clm.setMinWidth(0);
clm.setPreferredWidth(0);
TableColumn clm1= jTable1.getColumn("SITE_DESC");
clm1.setMaxWidth(0);
clm1.setMinWidth(0);
clm1.setPreferredWidth(0);
jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
if(e.getValueIsAdjusting()) return;
{
ListSelectionModel model = jTable1.getSelectionModel();
int lead = model.getLeadSelectionIndex();
displayRowValues(lead);
System.out.println("sono in value change, lead = " + lead);
}
}
private void displayRowValues(int rowIndex){
String txtfield5 = "";
String txtfield6 = "";
String txtfield8 = "";
String txtfield7 = "";
String txtfield9 = "";
Object otxtfield5 = jTable1.getValueAt(rowIndex, 0);
Object otxtfield6 = jTable1.getValueAt(rowIndex, 1);
Object otxtfield8 = jTable1.getValueAt(rowIndex, 2);
Object otxtfield7 = jTable1.getValueAt(rowIndex, 3);
Object otxtfield9 = jTable1.getValueAt(rowIndex, 4);
txtfield5 += otxtfield5.toString();
txtfield6 += otxtfield6.toString();
txtfield8 += otxtfield8.toString();
txtfield7 += otxtfield7.toString();
txtfield9 += otxtfield9.toString();
jTextField5.setText(txtfield5);
jTextField6.setText(txtfield6);
jTextField8.setText(txtfield8);
jTextField7.setText(txtfield7);
jTextField9.setText(txtfield9);
}
});
}
答案 0 :(得分:4)
问题在于您的选择侦听器,您不验证是否实际选择了任何内容。如果未选择任何内容,您将获得索引-1
:
int lead = model.getLeadSelectionIndex();
displayRowValues(lead); // lead could be -1 --> Hence the exception
重写它:
int lead = model.getLeadSelectionIndex();
if(lead>-1)
displayRowValues(lead);