2014-02-16 3 views
0

여기 새내기. 나는 DefaultListModel의 요소를 추가 할 때 DefaultListModel에 클래스를 추가 할 때 toString 또는 전체 클래스의 값을 저장 했습니까?

는, 나는 오버라이드 (override) toString로 클래스를 사용. 아래 예제 코드를 기반으로 btnid 단추를 클릭하면 선택한 항목의 ID를 표시하려고합니다. DisplayID 표시 아래

명령은 작동하지 않습니다. 도와주세요. 감사!

class SomeClass { 
JFrame f = new JFrame("Sample"); 
JScrollPane sp = new JScrollPane(); 
DefaultListModel dlm = new DefaultListModel(); 
JList lst = new JList(dlm); 

public SomeClass() { 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JButton btnadd = new JButton("Add"); 
    JButton btnid = new JButton("View ID"); 

    Container p = f.getContentPane(); 
    sp.getViewport().add(lst,null);  

    p.add(sp, BorderLayout.WEST); 
    p.add(btnadd, BorderLayout.EAST); 
    p.add(btnid, BorderLayout.SOUTH); 

    btnadd.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      dlm.addElement(new ElementDisplay(dlm.getSize(),"Element " + dlm.getSize())); 
     } 
    }); 

    btnid.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      displayID(); 
     } 
    }); 

    f.pack(); 
    f.setVisible(true);  
} 

private void displayID() { 
    ElementDisplay ed; 

    ed = dlm.getElementAt(lst.getSelectedIndex());  

    System.out.println(ed.elementID); 
} 

public static void main(String args[]) { 
    SomeClass sc = new SomeClass(); 
} 


class ElementDisplay { 
    public int elementID; 
    private String elementDescription; 

    public ElementDisplay(int pid, String pdesc) { 
     elementID=pid;  
     elementDescription=pdesc; 
    } 

    @Override 
    public String toString() { 
     return elementDescription; 
    } 
} 
} 

답변

0

나를 위해 잘 작동합니다. 그게 효과가 없다고 생각하는 이유는 무엇입니까? 버튼을 누르기위한 목록에서 실제로 선택한 항목을 가져와야합니다. ArrayIndexOutOfBoundException

버튼 누르기에 의존하는 대신 JList에 청취자를 추가하기 만하면됩니다. 그 경우에만 JList의 항목을 선택한 경우에만 인쇄됩니다. 버튼과 노력에 대한 필요는 ArrayIndexOutOfBoundException

lst.addListSelectionListener(new ListSelectionListener() { 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (e.getValueIsAdjusting()) { 
       JList list = (JList)e.getSource(); 
       DefaultListModel model = (DefaultListModel)list.getModel(); 
       ElementDisplay ed = (ElementDisplay) model.getElementAt(lst.getSelectedIndex()); 
       System.out.println(ed.elementID); 
     } 
    } 
}); 

당신이 다른 구성 요소에 사용할 수있는 가능한 청취자로 실행됩니다 How to Write Event Listeners를 참조 피해야합니다. GUI는 이벤트 중심이기 때문에 대부분의 것을 배우려면 시간이 필요합니다.

+0

감사합니다. 다른 JList 및 DefaultListModel을 작성하는 것이 실제로 필요한가? 그것은 내 솔루션과 유일한 차이점입니다. – user3315910

+0

또 다른'JList' _or_'DefaultListModel'을 만들지 않습니다. 방금 참조를 얻고 있습니다. 새로운 객체는'new' 키워드로 _only_ 생성됩니다. 내가하는 일은 그것을하는 적절한 방법이다. 그렇게하면 클래스 멤버로서'JList' 나'DefualtListModel'을 사용할 필요가 없습니다. 생성자에서 선언 할 수 있습니다. 범위에 대해 걱정할 필요가 없습니다. 데이터 필드가 적을수록 좋습니다. –

+0

'ElementDisplay ed'라는 참조를 얻는 것과 같은 방식으로,'JList'와'DefaultListModel'을 가지고했던 것과 같은 것입니다. –