2010-12-23 4 views

답변

10

:

래퍼 개념을 확장하려면 이것을 달성하는 것은 ListCellRenderer을 사용하는 것입니다. ListCellRenderer (실제로 모든 CellRenderer)는 목록에 각 객체를 그리는 데 사용되는 도장이라고 생각하십시오. 개체가 전달되면 구성 요소를 설정하고 구성 요소는 개체를 그리며 다음 개체로 이동합니다. CellRenderer에는 결코 상태가 없습니다.

이 예제를 고려하십시오 : 당신의 신속한 대답에 대한

// Extend DefaultListCellRenderer, takes care of most of the work for you 
public class ExampleListCellRenderer extends DefaultListCellRenderer 
{ 
    public Component getListCellRendererComponent(
     JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
    { 
     // I know DefaultListCellRenderer always returns a JLabel 
     // super setups up all the defaults 
     JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelect, cellHasFocus); 

     // "value" is whatever object you put into the list, you can use it however you want here 

     // I'm going to prefix the label text to demonstrate the point 

     label.setText("PRE:" + label.getText()); 

     return label; 

    } 
} 

// Some time later... 

JList list = new JList(); 
list.setCellRenderer(new ExampleListCellRenderer()); 
+0

basszero listcellrenderers 및 제공 한 예제에 대한 귀하의 상세하고 유익한 설명 주셔서 감사합니다. 나는 많은 것을 배웠다 :) – blackace

+0

@blackace - 대답 옆에있는 상자를 선택하여 그것을 수락하고 @basszero에게 점수를 준다. – I82Much

+0

@ i82 내가받은 두 가지 대답이 정확합니다. 나는 그것을 어떤 식 으로든 나타낼 수 없는가? – blackace

4

나는 이름이 그 목표의 toString() 방법에 의해 일어난 ㄴ다는 것을 생각한다. 당신이 그것을 바꿀 수 있다면, 그것은 가장 쉽습니다. 그렇지 않으면 빠른 해결책은 JList에 대한 객체보기를 생성하고 실제로 조작해야 할 때 포함 된 객체를 쉽게 검색 할 수있는 객체 주위에 홀더 객체를 래핑하는 것입니다. 당신이 (토해내) 대신에 어떤 toString (의)를 참조 할 정보 자체, 가장 직접적인 "스윙"방법에 개체에 포함되어있는 경우

class FooBarAgentHolder { 
    // Simple javabean stuff 
    private FooBarAgent agent; 
    public FooBarAgentHolder(FooBarAgent agent) { this.agent = agent; } 
    public FooBarAgent getAgent() { return agent; } 

    // Produce the name for human consumption 
    public String toString() { 
     return agent.getDescriptiveName(); // Or whatever... 
    } 

    // Convenience conversion function 
    public static DefaultListModel makeListModel(List<FooBarAgent> list) { 
     DefaultListModel result = new DefaultListModel(); 
     for (FooBarAgent agent: list) 
      result.addElement(new FooBarAgentHolder(agent)); 
     return result; 
    } 
} 
+0

감사합니다. 나는 원래의 객체 이름을 바꾸고 싶지 않다. 그래서 내가 알지 못하는 몇 가지 트릭이 없다면, 그 옵션이 문제가 아닌 것 같다. 두 번째 제안. 친절하게 확장 할 수 있습니까? 나는 이것에 대해 완전히 순진합니다. 예를 들어 매우 도움이 될 것입니다 ... – blackace

+0

@blackace : 시도해보십시오. 그것은 분명히 옳은 것을 알 수있는 간단한 코드 여야합니다. 실제 코드에 맞게 수정하십시오 (예 :'FooBarAgent' 변경 및'toString'에 올바른 작업 수행). –

+0

고마워요! 지금은 맑은 :-) – blackace