2012-01-05 5 views
1

List 안에 LabelTextArea을 정확하게 표시하려면 cellrenderer 목록에 정확하게 들어가야합니다. 문제는 비록 내가 ((TextArea)lData[i]).setGrowByContent(true);을 설정하더라도 TextArea가 커지지 않는다는 것입니다! 여기왜 ListArea는 setGrowByContent (true)가 List 셀 렌더러 내에 포함되어있을 때 비효율적입니까?

은 코드입니다 :

public class CListCellEtapesProspection extends CListCell 
{ 
    private Container cRowYAll = new Container(new BoxLayout(BoxLayout.Y_AXIS)); 
    private Container row1 = new Container(new BoxLayout(BoxLayout.X_AXIS)); 
    private Container row2 = new Container(new BoxLayout(BoxLayout.X_AXIS)); 
    private Container row3 = new Container(new BoxLayout(BoxLayout.X_AXIS)); 
    private Label[] labels; 
    private final int marginR = 5; 
    private Font appliFont = MenuPrincipalForm.r.getFont("FontLibelle"); 
    private int largeurRestant; 
    private Component[] lData; 

    public CListCellEtapesProspection(String[] libelles, boolean displayHorizontalLine, int formW) 
    { 
     super(displayHorizontalLine); 
     setLayout(new BoxLayout(BoxLayout.Y_AXIS)); 
     labels = new Label[libelles.length]; 
     lData = new Component[libelles.length]; 
     for (int i=0;i<libelles.length;i++) 
     { 
      labels[i] = new Label(libelles[i]); 
      labels[i].setUIID("ListLibelle"); 

      if (i != 2) 
      { 
       lData[i] = new Label(""); 
       lData[i].getStyle().setMargin(Component.TOP, 1); 
       lData[i].getStyle().setMargin(Component.BOTTOM, 1); 
      } 
      else 
      { 
       lData[i] = new TextArea(); 
       ((TextArea)lData[i]).getUnselectedStyle().setFont(appliFont, false); 
       ((TextArea)lData[i]).getSelectedStyle().setFont(appliFont, false); 
       ((TextArea)lData[i]).setPreferredH(appliFont.getHeight()*3); 
       ((TextArea)lData[i]).setGrowByContent(true); 
      } 
     } 
     labels[0].setPreferredW(Comparator.max(new int[]{labels[0].getPreferredW(),labels[1].getPreferredW(),labels[2].getPreferredW()})); 
     labels[1].setPreferredW(Comparator.max(new int[]{labels[0].getPreferredW(),labels[1].getPreferredW(),labels[2].getPreferredW()})); 
     labels[2].setPreferredW(Comparator.max(new int[]{labels[0].getPreferredW(),labels[1].getPreferredW(),labels[2].getPreferredW()})); 
     labels[0].getStyle().setMargin(Component.RIGHT, marginR, false); 
     labels[1].getStyle().setMargin(Component.RIGHT, marginR, false); 
     labels[2].getStyle().setMargin(Component.RIGHT, marginR, false); 
     largeurRestant = formW - (labels[0].getPreferredW() + marginR); 
     ((TextArea)lData[2]).setPreferredW(largeurRestant); 
     row1.addComponent(labels[0]); 
     row1.addComponent(lData[0]); 
     row2.addComponent(labels[1]); 
     row2.addComponent(lData[1]); 
     row3.addComponent(labels[2]); 
     row3.addComponent(lData[2]); 
     cRowYAll.addComponent(row1); 
     cRowYAll.addComponent(row2); 
     cRowYAll.addComponent(row3); 
     addComponent(cRowYAll); 
    } 
    public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) 
    { 
     String datetime = null; // 13/05/2003 16h 30mn 
     String datetimeFormated = null; // 13/05/2003 - 16h 30mn 
     Content entry = null; 
     if (value instanceof Content) 
      entry = (Content)value; 
     if (!"".equals(entry.getColumn(0))) 
     { 
      ((Label)lData[0]).setText(Formatage.nvl(entry.getColumn(1),"-")); 
      datetime = entry.getColumn(2); 
      if (!"".equals(datetime)) 
       datetimeFormated = datetime.substring(0, datetime.indexOf(" ")).concat(" - ").concat(datetime.substring(datetime.indexOf(" ")+1)); 
      if (!"".equals(datetime)) 
       ((Label)lData[1]).setText(datetimeFormated); 
      else 
       ((Label)lData[1]).setText("-"); 
      ((TextArea)lData[2]).setText(entry.getColumn(3)); 
     } 
     else 
     { 
      ((Label)lData[0]).setText("-"); 
      ((Label)lData[1]).setText("-"); 
      ((TextArea)lData[2]).setText(""); 
     } 
     list.repaint(); 
     return this; 
    } 
} 

슈퍼 클래스의 코드 : 데이터가 긴 문자열 데이터 때

public class CListCell extends Container implements ListCellRenderer { 

    private Label focus = new Label(""); 

    public CListCell(boolean paintHorizontalLine) 
    { 
     focus.setUIID("bandeau_selection_list"); 
     if (paintHorizontalLine) 
      getStyle().setBgPainter(new LigneHorizontalPainter(this, 13553358)); 
    } 

    public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) 
    { 
     return this; 
    } 

    public Component getListFocusComponent(List arg0) 
    { 
     return focus; 
    } 
} 

가 왜 TextArea에 성장하지 않는 이유는 무엇입니까?

답변

2

목록 렌더러에 대해 읽어야합니다. 렌더러는 목록 초기화 또는 모델 변경시 다소 복잡한 논리에 의해 결정되는 일정한 크기를가집니다.

ContainerList를 보거나 그 안에 구성 요소가있는 컨테이너 만 사용하십시오.

1

@Shai도 같은 문제가있었습니다. 거기에 해결 방법은 없었고 내 사용자 지정 목록 렌더러에는 텍스트 영역과 세 개의 레이블이 포함 된 테이블 레이아웃이있었습니다. 나는 컴포넌트가있는 컨테이너를 사용하는 것이 더 낫다는 것을 확신한다. (아주 천천히 스크롤하고 큰 모델을 위해 느리게 초점을 맞춘다.)