检索 JList 项的数组数据

Posted

技术标签:

【中文标题】检索 JList 项的数组数据【英文标题】:Retrieving array data for JList items 【发布时间】:2012-03-16 13:39:56 【问题描述】:

我有一个(访问)数据库表,其中包含我想填充到我的 java 程序中的列表中的数据。该表由多个列(id、name 等)组成

我想要一个列出所有名称的 JList,然后当双击列表中的一个项目时,我希望将该项目的 ID 号插入另一个表中。

我已经实现了该列表并使用 db 表(名称列)中的记录填充它。我遇到的问题是当用户双击该项目时,我如何获得该视频的 ID?填充列表的数据库调用选择多个列并将它们全部放入数组中,不太确定如何将该列表项链接到数组。

这是我目前得到的...

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);
     
   

.. 从这个 item 中只告诉我 JList 单元格中列出的内容,我需要能够做的是获取该选定项目的其他数组数据。

【问题讨论】:

video.get(3) 工作了吗?因为您只添加 3 个元素,而 get(index) 是基于 0 的。所以你正在访问第四个元素。 【参考方案1】:

应该用包含所有所需信息的对象填充 JList。然后只需转换检索到的项目(或者如果使用通用 JList,则无需转换)。要让 List 正确显示您的项目,请给它一个自定义渲染器(或者这样做的弱方法是给您的对象一个 toString() 方法,但使用渲染器要好得多)。您的列表似乎只包含从数据库返回的字段之一,而不是所有相关数据,我会更改它。

【讨论】:

-1 用于覆盖 toString (没有downvote,您更喜欢自定义渲染器来保护自己:-)【参考方案2】:

您可以创建一个以名称为键、以 id 为值的 hashmap。在填充 JList 时填充此哈希图。在 mouseClick 事件中,您可以使用函数 hashmap.get(name); 获取 ID;

【讨论】:

【参考方案3】:

(我使用泛型&lt;...&gt; 使代码更具可读性。)

正如@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;

【讨论】:

以上是关于检索 JList 项的数组数据的主要内容,如果未能解决你的问题,请参考以下文章

监听JList列表项的单击事件

从 JList 取回数据

在 JList 中显示数据库中的数据

Java order jlist 按状态

java JList 添加数据后,如何更新啊

JList不显示选定的值