如何给JList一个ID和名称?

时间:2018-11-04 08:10:15

标签: java

我有一个包含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

已经提前感谢! :)

1 个答案:

答案 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();

令我震惊的另一件事是,即使您的代码无法编译,您也没有在问题中发布编译错误。这是为什么?编译错误指示出什么地方以及哪里有问题。读取错误是出现错误时应该做的第一件事。不要忽略错误。阅读(错误,文档)对于编程至关重要。