我有一个包含2列(ID,名字)的简单数据库。现在,我将表中的每个“名字”显示为“列表项”。到目前为止有效。我想做的是将我的数据库表中的ID与名字连接起来,如果我单击列表项,数据将显示在文本字段中。
我创建了一个具有名称和ID作为字段的帮助程序类。
public class ListDataHelper {
private int id;
private String name;
public ListDataHelper(int id, String description) {
this.id = id;
this.name = description;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String toString() {
return name;
}
}
我的主类看起来像这样,到目前为止,它仍然有效。
private void getAllAccounts(){
listAccounts.removeAll();
try{
String sql="select * from accounts";
pst=conn.prepareStatement(sql);
rs=pst.executeQuery();
DefaultListModel DLM = new DefaultListModel();
while(rs.next()){
DLM.addElement(new ListDataHelper(rs.getInt("ID"), rs.getString("FirstName")));
}
listAccounts.setModel(DLM);
}
catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
finally {
try{
rs.close();
pst.close();
}
catch(Exception e) {
}
}
}
但是当我想检索数据时,我陷入了困境。我不知道如何使用我创建的帮助程序类或如何从selectedValue中获取ID。
private void getAllData() {
String data =listAccounts.getSelectedValue();
String sql="select * from accounts where ID=?";
try{
pst=conn.prepareStatement(sql);
pst.setString(1, data);
rs=pst.executeQuery();
while(rs.next()){
String add1 =rs.getString("ID");
txtID.setText(add1);
String add2 =rs.getString("FirstName");
txtFirstName.setText(add2);
String add3 =rs.getString("LastName");
txtLastName.setText(add3);
String add4 =rs.getString("Cheque");
txtCheque.setText(add4);
String add5 =rs.getString("Savings");
txtSavings.setText(add5);
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null, e);
}
finally {
try{
rs.close();
pst.close();
}
catch(Exception e) {
}
}
}
编译代码时,出现以下错误:
线程“ AWT-EventQueue-0”中的异常java.lang.ClassCastException: ccibank.ListDataHelper无法转换为java.lang.String
已经提前感谢! :)
答案 0 :(得分:1)
一如既往,通过阅读the documentation,一切都会变得简单。
正如您立即看到的那样,如果单击链接(或者只是阅读编译器发出的警告),DefaultListModel
是一个通用类,就像Collection一样。因此,您应该指定放置在此类模型中的对象的类型。您没有将Strings放入其中。您要放置ListDataHelper
的实例。所以应该声明为
DefaultListModel<ListDataHelper>
如果浏览到JList documentation,您会发现它也是通用类型:它包含与列表模型相同类型的元素。所以应该声明为
JList<ListDataHelper>
现在,在JList上调用getSelectedValue()
会得到什么?再次阅读the documentation:您将获得通用类型E的对象。在这种情况下,通用tpe E为ListDataHelper
。这很合理,不是吗?如果您在列表中存储类型ListDataHelper
的对象,则所选值不是字符串。这是ListDataHelper
。
因此代码应为:
ListDataHelper selectedAccount = listAccounts.getSelectedValue();
令我震惊的另一件事是,即使您的代码无法编译,您也没有在问题中发布编译错误。这是为什么?编译错误指示出什么地方以及哪里有问题。读取错误是出现错误时应该做的第一件事。不要忽略错误。阅读(错误,文档)对于编程至关重要。