2012-02-27 92 views
3

我有一个(访问)数据库表,其中包含我想要填充到我的Java程序列表中的数据。该表由多个柱(ID,名称等)检索JList项目的数组数据

我想要的是一个JList列出所有的名称(S),然后当从列表中的项目已被双击我想要的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; 

目前doulbe单击功能如下(我在网上找到的)

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单元格内列出什么,我需要能够做的是获取该选定项目的其他数组数据。

+0

是video.get(3)工作?因为你只添加了3个元素而get(index)是0。所以你正在访问第四元素。 – JProgrammer 2012-02-27 01:33:15

回答

1

(我已经使用泛型<...>使代码更具有可读性。)

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

-1为覆盖toString出于查看原因 – kleopatra 2012-02-27 09:27:59

1

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

+0

-1覆盖toString(没有downvote,你喜欢自定义渲染器:-) – kleopatra 2012-02-27 09:29:11

0

你可以制作一个名称作为key和id作为值的hashmap。在填充JList时填充此散列表。在mouseClick事件中,您可以使用函数hashmap.get(name)获取ID;