2014-10-20 3 views
2

Item이라는 사용자 정의 JPanel 구성 요소로 JList를 표시해야합니다. 이러한 구성 요소에는 고유 한 ID name이 있습니다. 그것들은 JList에 동적으로 추가되거나 방금 업데이트되었습니다 (이미 존재하는 경우). 다음 구현을 시도하지만 빈 JList 만 생성합니다. 제발 조언.JList에서 사용자 정의 JPanel 구성 요소 사용

enter image description here

class Item extends JPanel { 
    JLabel name = new JLabel(" "); 
    JLabel col1 = new JLabel(" "); 
    JLabel col2 = new JLabel(" ");  

    Item(){ 
     setMinimumSize(new Dimension(100, 20)); 
     setLayout(new BorderLayout()); 
     add(name, BorderLayout.WEST); 
     add(col1, BorderLayout.CENTER); 
     add(col2, BorderLayout.EAST); 
    } 
} 

public class Test_List extends JFrame { 
    private final JList list = new JList(new Item[0]); 
    HashMap<String, Item> map = new HashMap<String, Item>(); 

    Test_List(){ 
     setTitle("Test JList"); 
     setLayout(new BorderLayout()); 
     add(new JScrollPane(list), BorderLayout.CENTER); 
     pack(); 
    } 

    public void update_item(String name, String s1, String s2){ 
     Item item = map.get(name); 
     if (item == null){ // add new 
      item = new Item(); 
      item.name.setText(name); 
      map.put(name, item); 
      list.add(item); 
     } 
     item.col1.setText(s1); 
     item.col2.setText(s2); 
    } 

    public static void main(String s[]) { 
     final Test_List frame = new Test_List(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       frame.setVisible(true); 
      } 
     }); 
     frame.update_item("A", "a", "aa"); // add new item 
     frame.update_item("B", "b", "bb"); // add new item 
     frame.update_item("A", "aa", "a"); // update existing item 
    }   
} 
+1

이 한 번 봐보고, 모든 것을, 나는 당신이 사용 JTable와 더 나을 것이라고 생각했다 가졌 [Custom Cell Renderer 작성] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html#renderer) – MadProgrammer

+1

아, 모델에 구성 요소를 추가하지 마십시오. 모델 데이터 모델 – MadProgrammer

답변

7

모델은 데이터 모델링에 대한 책임, 모델이 표시되는 방법을 신경 안대로, 특정 정보 UI를 포함해서는 안됩니다, 그렇게 데이터를 변환하기위한 책임이있다 뷰/모델 계약 (이 경우 ListModel 계약)을 확인합니다. Writing a Custom Cell Renderer

A List

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.ListCellRenderer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.Border; 
import javax.swing.border.EmptyBorder; 

public class TestListCellRenderer { 

    public static void main(String[] args) { 
     new TestListCellRenderer(); 
    } 

    public TestListCellRenderer() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       DefaultListModel model = new DefaultListModel(); 
       model.addElement(new Item("A", "a", "aa")); 
       model.addElement(new Item("B", "b", "bb")); 
       model.addElement(new Item("C", "c", "cc")); 
       model.addElement(new Item("D", "d", "dd")); 

       JList list = new JList(model); 
       list.setCellRenderer(new ItemCellRenderer()); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(list)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class Item { 
     private String name; 
     private String col1; 
     private String col2; 

     public Item(String name, String col1, String col2) { 
      this.name = name; 
      this.col1 = col1; 
      this.col2 = col2; 
     } 

     public String getCol1() { 
      return col1; 
     } 

     public String getCol2() { 
      return col2; 
     } 

     public String getName() { 
      return name; 
     } 

    } 

    public static class ItemCellRenderer extends JPanel implements ListCellRenderer<Item>{ 

     private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); 
    private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); 
    protected static Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER; 

     JLabel name = new JLabel(" "); 
     JLabel col1 = new JLabel(" "); 
     JLabel col2 = new JLabel(" "); 

     public ItemCellRenderer() { 
      setLayout(new BorderLayout()); 
      add(name, BorderLayout.WEST); 
      add(col1, BorderLayout.CENTER); 
      add(col2, BorderLayout.EAST); 
     } 

     @Override 
     public Dimension getMinimumSize() { 
      return new Dimension(100, 20); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return getMinimumSize(); 
     } 


    protected Border getNoFocusBorder() { 
     Border border = UIManager.getBorder("List.cellNoFocusBorder"); 
     if (System.getSecurityManager() != null) { 
      if (border != null) return border; 
      return SAFE_NO_FOCUS_BORDER; 
     } else { 
      if (border != null && 
        (noFocusBorder == null || 
        noFocusBorder == DEFAULT_NO_FOCUS_BORDER)) { 
       return border; 
      } 
      return noFocusBorder; 
     } 
    } 

     @Override 
     public Component getListCellRendererComponent(JList<? extends Item> list, Item value, int index, boolean isSelected, boolean cellHasFocus) { 
      setComponentOrientation(list.getComponentOrientation()); 

      Color bg = null; 
      Color fg = null; 

      JList.DropLocation dropLocation = list.getDropLocation(); 
      if (dropLocation != null 
          && !dropLocation.isInsert() 
          && dropLocation.getIndex() == index) { 

       bg = UIManager.getColor("List.dropCellBackground"); 
       fg = UIManager.getColor("List.dropCellForeground"); 

       isSelected = true; 
      } 

      if (isSelected) { 
       setBackground(bg == null ? list.getSelectionBackground() : bg); 
       setForeground(fg == null ? list.getSelectionForeground() : fg); 
      } else { 
       setBackground(list.getBackground()); 
       setForeground(list.getForeground()); 
      } 

      name.setText(value.getName()); 
      col1.setText(value.getCol1()); 
      col2.setText(value.getCol2()); 

      name.setForeground(getForeground()); 
      col1.setForeground(getForeground()); 
      col2.setForeground(getForeground()); 

      setEnabled(list.isEnabled()); 

      name.setFont(list.getFont()); 
      col1.setFont(list.getFont()); 
      col2.setFont(list.getFont()); 

      Border border = null; 
      if (cellHasFocus) { 
       if (isSelected) { 
        border = UIManager.getBorder("List.focusSelectedCellHighlightBorder"); 
       } 
       if (border == null) { 
        border = UIManager.getBorder("List.focusCellHighlightBorder"); 
       } 
      } else { 
       border = getNoFocusBorder(); 
      } 
      setBorder(border); 

      return this; 
     } 
    } 
} 

를 살펴 취함으로써

시작 How to Use Tables

+0

고마워요! 건설 중에'Item' 구성 요소가 없습니다. 그들은 update_item()을 통해 지속적으로 추가되거나 업데이트되고있다. 그러나 나는 여기서 계속할 수 있다고 생각한다. 다시 한번 감사드립니다. – Serg

+0

렌더러를 업데이트하지 말고 모델의 항목을 업데이트하십시오. 'DefaultTableModel'과 같은 것을 사용한다면이 항목을 사용하여 관리하는 항목을 추가하거나 변경할 수 있으며 뷰를 업데이트해야합니다. 'Item' 객체 자체를 업데이트하는 것만으로는 충분하지 않습니다. – MadProgrammer