2012-02-27 4 views
3

Java 프로그램의 목록에 채우려는 데이터가 들어있는 (액세스) 데이터베이스 테이블이 있습니다. 테이블은 여러 열 (id, 이름 등)으로 구성됩니다.JList 항목의 배열 데이터 검색

내가 원하는 것은 모든 이름을 나열한 JList이고 목록의 항목을 두 번 클릭하면 ID 번호가 필요합니다. 해당 항목을 다른 테이블에 삽입 할 수 있습니다.

나는 이미 목록을 구현하고 db 테이블 (이름 열)의 레코드로 채 웠습니다. 내가 문제가되는 것은 사용자가 항목을 두 번 클릭 할 때 해당 비디오의 ID를 어떻게 얻을 수 있습니까? 목록을 채우는 데이터베이스 호출은 여러 열을 선택하여 배열에 넣습니다. 목록 항목을 배열에 연결할 수있는 방법이 확실하지 않습니다. 여기

... 나는 지금까지 무엇을 가지고 있습니다

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 클릭 기능을 포함 된 내용

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

는 (다음 인 자바 클래스 내가 그물에서 찾은)

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

답변

1

(I 사용한 제네릭 <...> 코드를 읽기 쉽게 만들 수 있습니다.)

이 @HovercraftFullOfEels 말했듯이, JList의이 전체 비디오 객체를 포함 할 수 있습니다 :

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

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

사용법은 다음과 같이 진행을 다음과 같습니다. getVideoList와

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

같이 :

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

1

JList는 필요한 모든 정보가 들어있는 객체로 채워야합니다. 그런 다음 검색된 항목을 단순히 캐스팅합니다 (또는 일반 JList를 사용하는 경우 캐스팅 할 필요가 없습니다). Item을 올바르게 표시하려면 List에 사용자 정의 렌더러를 지정하십시오. 또는이를 수행하는 약한 방법은 객체에 toString() 메서드를 사용하는 것이지만 렌더러를 사용하는 것이 훨씬 좋습니다. 목록에 모든 관련 데이터가 아닌 데이터베이스에서 반환 된 필드 중 하나가 포함 된 것으로 보입니다.이 필드를 변경해야합니다.

+0

-1 toString을 오버라이드 (downvote하지 않고, 사용자 정의 렌더러를 선호 함 :-) – kleopatra

0

키를 name으로, 값을 id로 사용하여 해시 맵을 만들 수 있습니다. JList를 채우는 동안이 해시 맵을 채 웁니다. mouseClick 이벤트에서 함수를 사용하여 ID를 얻을 수 있습니다. hashmap.get (name);