2013-10-22 2 views
2

모두 좋은 하루! 몇 가지 질문이 있습니다 : 어떻게 내 JList의 메서드를 재정의 할 수 있고, Point의 배열을 가지고 있으며, 서버와 클라이언트 사이를 걷는 것이 좋아서 Point의 toString()을 재정의 할 수 없습니다. 내 논리는 내 JList 또는 DefaultListModel에서이를 수행 할 수 있다고 말하지만 정보를 찾을 수는 없습니다 (아마 Google에서 그 방법을 모르겠습니다). 그래서 어쩌면 아무도 어떻게 알 수 있을까요?JList가 올바른 표시를 위해 셀의 toString을 대체합니다.

p.s. 나의 영어와 문법에 대해 유감스럽게 생각한다.

public class PointsList extends JPanel { 
    private Extra extra; 
    private JList<Point> pointsList; 
    private DefaultListModel<Point> listModel; 

    public PointsList(Extra extra) { 
     this.extra = extra; 
     setBackground(Settings.pointListBackround); 
     listModel = new DefaultListModel<Point>(); 
     pointsList = new JList<Point>(
       //Which method i must override, to change cell toString 
     }; 
     pointsList.getSelectionModel().addListSelectionListener(getSelectionListAction()); 
     setLayout(new BorderLayout()); 
     add(pointsList); 
     setPreferredSize(new Dimension(150, 100)); 
    } 

    private ListSelectionListener getSelectionListAction() { 
     return new ListSelectionListener() { 
      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       if (e.getValueIsAdjusting()) { 
        extra.setSelectedPoint(pointsList.getSelectedValue()); 
        extra.repaintCanvas(); 
       } 
      } 
     }; 
    } 

    public void updateList() { 
     listModel.removeAllElements(); 
     for (Map.Entry<Point, Boolean> currentPoint : extra.getPoints().entrySet()) { 
      listModel.addElement(currentPoint.getKey()); 
     } 
    } 
} 

내 대답 : 난 그냥 포인트의 toString을 재정의 할 수 없습니다

public class PointsList extends JPanel { 
    private Extra extra; 
    private JList<Point> pointsList; 
    private DefaultListModel<Point> listModel; 

    public PointsList(Extra extra) { 
     this.extra = extra; 
     setBackground(Settings.pointListBackround); 
     listModel = new DefaultListModel<Point>(); 
     pointsList = new JList<Point>(listModel); 
     pointsList.setCellRenderer(getRender()); 
     pointsList.getSelectionModel().addListSelectionListener(getSelectionListAction()); 
     setLayout(new BorderLayout()); 
     add(pointsList); 
     setPreferredSize(new Dimension(150, 100)); 
    } 

    private ListSelectionListener getSelectionListAction() { 
     return new ListSelectionListener() { 
      @Override 
      public void valueChanged(ListSelectionEvent e) { 
       if (e.getValueIsAdjusting()) { 
        extra.setSelectedPoint(pointsList.getSelectedValue()); 
        extra.repaintCanvas(); 
       } 
      } 
     }; 
    } 

    public void updateList() { 
     listModel.removeAllElements(); 
     for (Map.Entry<Point, Boolean> currentPoint : extra.getPoints().entrySet()) { 
      listModel.addElement(currentPoint.getKey()); 
     } 
    } 

    private ListCellRenderer<Point> getRender() { 
     return new ListCellRenderer<Point>() { 
      @Override 
      public Component getListCellRendererComponent(JList<? extends Point> list, Point value, int index, boolean isSelected, boolean cellHasFocus) { 
       JLabel cell = new JLabel("(" + value.x + " , " + value.y + ")"); 
       cell.setForeground(Color.black); 
       return cell; 
      } 
     }; 
    } 
} 

답변

2

(이것은 몇 가지 코드는 '왜냐하면 나는 새로운 클래스를 생성하지 않음)().

사용자 정의 렌더러를 사용해야합니다. How to Use Lists의 스윙 튜토리얼에서 Writing a Custom Renderer 섹션을 읽어보십시오.