2013-04-14 2 views
3

JList/DefaultListModel을 사용하여 데이터 자체를 보유하는 목록을 만들려고합니다.Java의 DefaultListModel에서 데이터를 유지하는 방법

여기 내 문제입니다.

DefaultListModel my_docs = new DefaultListModel(); 
JList my_jlist = new JList(my_docs); 
// From here, I add elements to my_docs.. 
my_docs.addElement("Document 1"); 
my_docs.addElement("Document 2"); 
my_docs.addElement("Document 3"); 

내가 클릭 할 때까지 다른 변수에 할당하지 않는 요소에 (4,000 바이트 평균) 각 문서의 텍스트를 유지하기 위해 무엇을 할 수 있을까?

예를 들어 목록에서 문서 2를 클릭하면 문서의 텍스트가 변수에 할당됩니다. 목록에서 문서 1을 클릭하면 동일한 작업을 수행합니다.

정보가 부족하여 죄송합니다. 어디서부터 시작해야할지 모르겠습니다.

답변

5

문서의 래퍼를 만들 수 있습니다. 예를 들어 래퍼는 데이터와 이름을 노출 할 수 있습니다. 필요한 경우 데이터를로드 할 수도 있습니다. 랩퍼의 인스턴스를 목록에 추가하십시오. 문서 이름을 사용하여 목록의 각 항목을 렌더링합니다. 목록에서 항목을 선택하면 선택한 항목을 사용하여 작업 할 수 있습니다. 다음은 문서 목록을 표시하는 간단한 예제입니다. 문서가 선택되면 해당 내용이 텍스트 영역에 표시됩니다.

import java.awt.BorderLayout; 
import java.awt.Component; 
import javax.swing.*; 
import javax.swing.event.*; 

public class TestListModel { 
    public TestListModel() { 

     DefaultListModel model = new DefaultListModel(); 
     model.addElement(new DocumentWrapper("Doc 1", "Doc 1 data")); 
     model.addElement(new DocumentWrapper("Doc 2", "Doc 2 data")); 
     model.addElement(new DocumentWrapper("Doc 3", "Doc 3 data")); 

     final JList list = new JList(); 

     final JTextArea output = new JTextArea(5, 40); 
     list.setModel(model); 
     list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

     list.setCellRenderer(new DocumentWrapperRenderer()); 

     list.getSelectionModel().addListSelectionListener(
       new ListSelectionListener() { 
        @Override 
        public void valueChanged(ListSelectionEvent e) { 
         if (!e.getValueIsAdjusting()) { 
          DocumentWrapper docWrapper = (DocumentWrapper) list 
            .getSelectedValue(); 
          if (docWrapper != null) { 
           output.setText(docWrapper.getData()); 
          } else { 
           output.setText(""); 
          } 
         } 
        } 
       }); 

     JFrame frame = new JFrame("Document list"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(list)); 
     frame.add(output, BorderLayout.SOUTH); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public class DocumentWrapper { 
     private String data; 
     private String name; 

     public DocumentWrapper(String name, String data) { 
      this.name = name; 
      this.data = data; 
     } 

     public String getData() { 
      return data; 
     } 

     public String getName() { 
      return name; 
     } 
    } 


    public static class DocumentWrapperRenderer extends DefaultListCellRenderer { 
     @Override 
     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean hasFocus) { 
      if (value instanceof DocumentWrapper) { 
       return super.getListCellRendererComponent(
         list, ((DocumentWrapper) value).getName(), index, 
         isSelected, hasFocus); 
      } 
      return super.getListCellRendererComponent(list, value, index, 
        isSelected, hasFocus); 
     } 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestListModel(); 
      } 
     }); 
    } 
} 
+1

매우 유용한 예 – programmer