Получение данных массива для элементов JList

У меня есть таблица базы данных (доступа), которая содержит данные, которые я хотел бы заполнить в списке в моей программе Java. Таблица состоит из нескольких столбцов (идентификатор, имя и т. д.)

Я хотел бы, чтобы JList перечислял все имена, а затем, когда элемент из списка был дважды щелкнут, я хотел бы, чтобы идентификационный номер этого элемента был вставлен в другую таблицу.

Я уже реализовал список и заполнил его записями из таблицы БД (столбец имени). У меня проблемы с тем, что когда пользователь дважды щелкает элемент, как я могу получить идентификатор для этого видео? Вызов базы данных, который заполняет список, выбирает несколько столбцов и помещает их все в массив, не совсем уверен, как я могу связать этот элемент списка с массивом.

Вот что я получил до сих пор...

Java-класс

  ArrayList list = new ArrayList();
  ArrayList video = new ArrayList();
  list = VideoData.getVideoList();

  JList videolist = new JList();;  
  Vector data = new Vector();;  

  for (int i=0; i < list.size(); i++) {
           video = (ArrayList) list.get(i);
           data.addElement(video.get(3));
       }

  videolist.setListData(data);
  videolist.setSelectedIndex(0);
  videolist.addMouseListener(new ActionJList(videolist));
  videolist.setFixedCellWidth(300);
  add(new JScrollPane(videolist));

Что содержит getVideoList()

ArrayList list = new ArrayList();

try {
    ResultSet res = stmt.executeQuery("SELECT * FROM Items ORDER BY VidID ASC");
    while (res.next()) { // there is a result
      ArrayList sub = new ArrayList();
      sub.add(res.getString("VidID"));;
      sub.add(res.getString("Name"));
      sub.add(res.getString("Writer"));
       // add sub array  to list
      list.add(sub); 
    }
} catch (Exception e) {
    System.out.println(e);
    return null;
}

return list;

Текущая функция двойного клика следующая (которую я нашел в сети):

  public void mouseClicked(MouseEvent e){     
   if(e.getClickCount() == 2){ // double click
     int index = list.locationToIndex(e.getPoint());
     ListModel dlm = list.getModel();
     Object item = dlm.getElementAt(index);;
     list.ensureIndexIsVisible(index);
     System.out.println("Double clicked on " + item);
     }
   }

.. Из этого элемента сообщается только то, что указано в ячейке JList. Что мне нужно сделать, так это получить другие данные массива для этого выбранного элемента.


person InvalidSyntax    schedule 27.02.2012    source источник
comment
работает ли video.get(3)? потому что вы добавляете только 3 элемента, а get(index) основан на 0. Итак, вы получаете доступ к 4-му элементу.   -  person JProgrammer    schedule 27.02.2012


Ответы (3)


(Я использовал универсальные шаблоны <...>, чтобы сделать код более читабельным.)

Как сказал @HovercraftFullOfEels, JList может содержать весь видеообъект:

static class Video {
    String vidID;
    String name;
    String writer;

    @Override
    public String toString() {
        return writer; // For JList display
    }
}

Далее использование происходит следующим образом.

List<Video> list = VideoData.getVideoList();

JList videolist = new JList();

Vector<Video> data = new Vector<Video>();  
for (int i=0; i < list.size(); i++) {
    Video video = list.get(i);
    data.addElement(video);
}

videolist.setListData(data);
videolist.setSelectedIndex(0);
videolist.addMouseListener(new ActionJList(videolist));
videolist.setFixedCellWidth(300);
add(new JScrollPane(videolist));

с getVideoList как:

List<Video> getVideoList() {
List<Video> list = new ArrayList<Video>();

try {
    ResultSet res = stmt.executeQuery("SELECT VidID, Name, Writer FROM Items ORDER BY VidID ASC");
    while (res.next()) { // there is a result
        Video sub = new Video();
        sub.vidID = res.getString("VidID");
        sub.name = res.getString("Name");
        sub.writer = res.getString("Writer");
        list.add(sub); 
    }
        res.close();
} catch (Exception e) {
    System.out.println(e);
    return null;
}

return list;
}
person Joop Eggen    schedule 27.02.2012

JList должен быть заполнен объектами, содержащими всю необходимую информацию. Затем просто приведите полученный элемент (или, если используется общий JList, приведение не требуется). Чтобы список правильно отображал ваши элементы, назначьте ему собственный рендерер (или слабый способ сделать это — дать вашему объекту метод toString(), но использование рендерера намного лучше). Похоже, что ваш список содержит только одно из полей, возвращенных из базы данных, а не все соответствующие данные, и я бы изменил это.

person Hovercraft Full Of Eels    schedule 27.02.2012
comment
-1 за переопределение toString (без понижения, вы обезопасили себя, предпочтя собственный рендерер :-) - person kleopatra; 27.02.2012

Вы можете создать хэш-карту с именем в качестве ключа и идентификатором в качестве значения. заполнить эту хэш-карту при заполнении JList. в событии mouseClick вы можете получить идентификатор, используя функцию hashmap.get(name);

person JProgrammer    schedule 27.02.2012