2010-05-12 2 views
1

Java Api에서 AbstractListModel 클래스를 확장하는 DirectoryListModel 클래스를 정의했습니다.JLists 및 ListModels 사용

내부적으로는 File 개체 목록이 있습니다. 나는 정의 된대로 getElementAt(int index) 방법 :

@Override 
public Object getElementAt(int index) { 
    return directoryElements.get(index) 
} 

문제는 내 DirectoryListModel 내 JList의를 실행하려고하면, 대신 파일 이름의 파일의 전체 경로를 표시하는 것입니다 것입니다. 나는이 코드를 변경할 수 있습니다 :

@Override 
public Object getElementAt(int index) { 
    return directoryElements.get(index).getName(); 

} 

그것은 놀라운 일을 싶지만, 문제는 onclick 이벤트에 내가 (여부를 확인 파일 내가 그들과 함께 몇 가지 검사를 할 수 있도록 객체를 가지고 할 것이다 그들은 디렉토리 등). getElementAt() 문자열을 반환하면 JList가 내 창에 파일을 표시하기 전에 또는 내 모든 파일 개체의 서식을 지정할 수있는 방법이 있다면 알려 주시면됩니다. 우아한 이런 식으로.

감사합니다.

답변

2

나는 두 가지 이유로 사용자 정의 코드를 추가 할 DefaultListCellRenderer을 확장 할 것 (모든 스윙 렌더러와 마찬가지로) 빠른 페인팅을 위해 최적화되었습니다.

class MyRenderer extends DefaultListCellRenderer 
{ 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
    { 
     Component c = super.getListCellRendererComponent(list,value,index,false,false) ; 
     JLabel label = (JLabel)c; 

     label.setText(...); 

     return c ; 
    } 
} 

는 렌더러에 대한 자세한 내용은 How to Use Lists에 스윙 튜토리얼 섹션을 읽어보십시오.

2

가장 좋은 방법은 렌더러를 사용하는 것입니다. 이름에서 모을 수있는 렌더러는 V을 패러다임의 지원 데이터 M으로 재생하는 데 사용됩니다. 이 경우 File이 배킹 데이터이고 렌더러는 표시하려는 File의 일부만 표시하는 데 사용됩니다.

public Component getListCellRendererComponent(JList list, 
               Object value, 
               int index, 
               boolean isSelected, 
               boolean cellHasFocus) { 

    setText(((File)value).getName()); 
    return this; 
} 

ListCellRenderer의 javadoc를 살펴 보자 :

는이 JLabelListCellRenderer을 구현,이 같은 하나의 인터페이스 방법을 구현하여 간단한 시도로 시작할 수 확장, 사용자 정의 셀 렌더러를 구현 할 수 있었 좀 더 자세한 안내는.) 렌더러를

가) 당신은 행 선택이
B ... 강조, 테두리와 같은 기본 렌더러의 기본 동작을 얻을 것이다 :