2013-10-22 16 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()); 
     } 
    } 
} 

我的答案:(我不希望創建新類,COS'這是幾碼)

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

我不能只覆蓋點的toString()。

您需要使用自定義渲染器。閱讀Swing教程中的Writing a Custom Renderer部分,網址爲How to Use Lists