У меня простая база данных с двумя столбцами (ID, Firstname). Теперь я отображаю каждое имя из моей таблицы как элемент списка. Пока это работает. Что я хочу сделать, так это связать свой идентификатор из моей таблицы db с первой причиной, если я нажму на элемент списка, данные будут отображаться в текстовом поле.
Я создал вспомогательный класс с полями Name и 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.
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) {
}
}
}
Когда я компилирую код, я получаю следующую ошибку:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: ccibank.ListDataHelper cannot be cast to java.lang.String
Заранее спасибо! :)




Как всегда все было бы проще, прочитав документация.
Как сразу видно, если щелкнуть ссылку (или просто прочитать предупреждения, выдаваемые компилятором), DefaultListModel является универсальным классом, как и Коллекция. Итак, вы должны указать тип объектов, которые вы помещаете в такую модель. Вы не вкладываете струны внутрь. Вы ставите экземпляры ListDataHelper. Поэтому его следует объявить как
DefaultListModel<ListDataHelper>
Если вы перейдете к Документация JList, вы увидите, что это также общий тип: он содержит элементы того же типа, что и его модель списка. Поэтому его следует объявить как
JList<ListDataHelper>
Итак, что вы получаете, когда вызываете getSelectedValue() в JList? Снова прочтите документация: вы получите объект универсального типа E. В этом случае универсальным типом E является ListDataHelper. В этом есть смысл, не так ли? Если вы храните в списке объекты типа ListDataHelper, выбранное значение не является строкой. Это ListDataHelper.
Итак, код должен быть:
ListDataHelper selectedAccount = listAccounts.getSelectedValue();
Еще меня поразило то, что, хотя ваш код не компилируется, вы не опубликовали в своем вопросе ошибки компиляции. Это почему? Ошибки компиляции указывают, что и где не так. Чтение ошибки - это первое, что вы должны сделать, когда у вас есть ошибка. Не игнорируйте ошибки. Чтение (ошибки, документация) чрезвычайно важно при программировании.
Я знаю это. Но почему бы вам не прочитать ошибку. Опять же, вы написали, что произошла ошибка, не сказав какие, что это ошибка. я знает, что это за ошибка, просто прочитав код, но вы этого не делаете. Так почему бы не прочитать ошибку?
Извините, я редактировал текст ... Я новичок в Java и stackoverflow ...
Как вы объявили свою переменную listAccounts?
listAccounts - это имя моей переменной для моего Jlist
Я не об этом спросил. Я спросил, как вы это заявили. Вы заявили, что это JList<String> listAccounts, да? Но что мой андер говорит о том, как это должно быть объявлено? Есть ли в списке строки? Что в нем содержится? Внимательно прочтите мои комментарии и мой ответ.
Позвольте нам продолжить обсуждение в чате.
Спасибо за ваш ответ. Да, я должен прочитать документацию, вы правы. Когда я компилирую свой код, он запускает ошибку, когда я выбираю значение из своего Jlist. Исключение в потоке «AWT-EventQueue-0» java.lang.ClassCastException: ccibank.ListDataHelper не может быть преобразован в java.lang.String И если я добавлю код, который вы упомянули выше: ListDataHelper selectedAccount = listAccounts.getSelectedValue (); моя IDE говорит: строка не может быть преобразована в ListDataHelper Я постараюсь прочитать документы, чтобы лучше понять, что я делаю