2014-03-28 5 views
4

사용자 정의 GridField Manager를 사용하여 지정된 너비로 2 열의 세부 정보를 표시하고 있습니다. 오른쪽의 값이 너무 크면 값이 다음 줄로 줄 바꿈되지 않습니다.사용자 정의 GridField Manager가있는 BB에서 단어 배치가 작동하지 않습니다.

여기 내 맞춤 GridField 관리자입니다.

public class CustomGridFieldManager extends Manager { 
private int[] columnWidths; 
private int columns; 
private int allRowHeight = -1; 


public CustomGridFieldManager(int columns, long style) { 
    super(style); 
    this.columns = columns; 
} 


public CustomGridFieldManager(int[] columnWidths, long style) { 
    super(style); 
    this.columnWidths = columnWidths; 
    this.columns = columnWidths.length; 

} 

public CustomGridFieldManager(int[] columnWidths, int rowHeight, long style) { 
    this(columnWidths, style); 
    this.allRowHeight = rowHeight; 
} 

protected boolean navigationMovement(int dx, int dy, int status, int time) { 

    int focusIndex = getFieldWithFocusIndex(); 
    while(dy > 0) { 
     focusIndex += columns; 
     if (focusIndex >= getFieldCount()) { 
      return false; // Focus moves out of this manager 
     } 
     else { 
      Field f = getField(focusIndex); 
      if (f.isFocusable()) { // Only move the focus onto focusable fields 
       f.setFocus(); 
       dy--; 
      } 
     } 
    } 
    while(dy < 0) { 
     focusIndex -= columns; 
     if (focusIndex < 0) { 
      return false; 
     } 
     else { 
      Field f = getField(focusIndex); 
      if (f.isFocusable()) { 
       f.setFocus(); 
       dy++; 
      } 
     } 
    } 

    while(dx > 0) { 
     focusIndex ++; 
     if (focusIndex >= getFieldCount()) { 
      return false; 
     } 
     else { 
      Field f = getField(focusIndex); 
      if (f.isFocusable()) { 
       f.setFocus(); 
       dx--; 
      } 
     } 
    } 
    while(dx < 0) { 
     focusIndex --; 
     if (focusIndex < 0) { 
      return false; 
     } 
     else { 
      Field f = getField(focusIndex); 
      if (f.isFocusable()) { 
       f.setFocus(); 
       dx++; 
      } 
     } 
    } 
    return true; 
} 

protected void sublayout(int width, int height) { 
    int y = 0; 
    if (columnWidths == null) { 
     columnWidths = new int[columns]; 
     for(int i = 0; i < columns; i++) { 
      columnWidths[i] = width/columns; 
     } 
    } 
    Field[] fields = new Field[columnWidths.length]; 
    int currentColumn = 0; 
    int rowHeight = 0; 
    for(int i = 0; i < getFieldCount(); i++) { 
     fields[currentColumn] = getField(i); 
     layoutChild(fields[currentColumn], columnWidths[currentColumn], height-y); 
     if (fields[currentColumn].getHeight() > rowHeight) { 
      rowHeight = fields[currentColumn].getHeight(); 
     } 
     currentColumn++; 
     if (currentColumn == columnWidths.length || i == getFieldCount()-1) { 
      int x = 0; 
      if (this.allRowHeight >= 0) { 
       rowHeight = this.allRowHeight; 
      } 
      for(int c = 0; c < currentColumn; c++) { 
       long fieldStyle = fields[c].getStyle(); 
       int fieldXOffset = 0; 
       long fieldHalign = fieldStyle & Field.FIELD_HALIGN_MASK; 
       if (fieldHalign == Field.FIELD_RIGHT) { 
        fieldXOffset = columnWidths[c] - fields[c].getWidth(); 
       } 
       else if (fieldHalign == Field.FIELD_HCENTER) { 
        fieldXOffset = (columnWidths[c]-fields[c].getWidth())/2; 
       } 

       int fieldYOffset = 0; 
       long fieldValign = fieldStyle & Field.FIELD_VALIGN_MASK; 
       if (fieldValign == Field.FIELD_BOTTOM) { 
        fieldYOffset = rowHeight - fields[c].getHeight(); 
       } 
       else if (fieldValign == Field.FIELD_VCENTER) { 
        fieldYOffset = (rowHeight-fields[c].getHeight())/2; 
       } 

       setPositionChild(fields[c], x+fieldXOffset, y + fieldYOffset); 
       x += columnWidths[c]; 
      } 
      currentColumn = 0; 
      y += rowHeight; 
     } 
     if (y >= height) { 
      break; 
     } 
    } 
    int totalWidth = 0; 
    for(int i = 0; i < columnWidths.length; i++) { 
     totalWidth += columnWidths[i]; 
    } 
    setExtent(totalWidth, Math.min(y, height)); 
} 

} 다른 클래스에서

, 나는이 사용자 정의 GridField 관리자 클래스를 사용합니다.

int[] width = { (int) (Display.getWidth()/2.9), 
        (int) (Display.getWidth()/1.1) }; 

      final CustomGridFieldManager gfm_transactioninfo = new CustomGridFieldManager(
        width, 35, Manager.VERTICAL_SCROLL | Manager.FIELD_HCENTER 
          | FOCUSABLE) { 
       protected void paint(Graphics graphics) { 
        // TODO Auto-generated method stub 
        graphics.setColor(AppData.color_black); 
        super.paint(graphics); 
       } 

      }; 
      gfm_transactioninfo.setMargin(10, 0, 0, 10);// set top and left margin 

이 같은 Labelfiled를 추가

, 어떤 한 다음 아이디어가 PLS 도움말 경우

lbl_CustEmail = new LabelField("Customer Email", LabelField.FOCUSABLE); 
      lbl_CustEmail.setFont(label_font); 

      value_CustEmail = new LabelField(": " +trandtail[0].getFromEmail()); 
      value_CustEmail.setFont(label_font); 

gfm_transactioninfo.add(lbl_CustEmail); 
         gfm_transactioninfo.add(value_CustEmail); 

.

+0

주어진 예제에서 wrapping되지 않은 value_CustEmail LabelField임을 확인할 수 있습니까? 초점을 맞춰서 수평으로 스크롤하여 모든 것을 볼 수 있는지 알아볼 수 있습니까? –

+0

초점을 맞추면 초점을 맞출 수는 있지만 스크롤 할 수 없게됩니다. –

+0

LabelField.FOCUSABLE을 사용했습니다. 이제 수평으로 스크롤 할 수있게 만드는 방법을 말해 줄 수 있습니까? –

답변

3

너는 두 부분으로 너비를 나누고있다.하지만 내 제안은 넓이를 세 부분으로 나누어야한다는 것이다. ":" 새로운 레이블 필드에

int[] width = { (int) (Display.getWidth()/3.2), 
        (int) (Display.getWidth()/32),(int) (Display.getWidth()/1.6) }; 

그리고 을 구별있다. 여기

내 제안 코드 .. 난 이미 시도했다되고 그것을 잘 작동합니다 ..

int[] width = { (int) (Display.getWidth()/3.2), 
        (int) (Display.getWidth()/32),(int) (Display.getWidth()/1.6) }; 

      final CustomGridFieldManager gfm_transactioninfo = new CustomGridFieldManager(
        width,45, Manager.VERTICAL_SCROLL | Manager.FIELD_HCENTER 
          | FOCUSABLE) { 
       protected void paint(Graphics graphics) { 
        // TODO Auto-generated method stub 
        graphics.setColor(AppData.color_black); 
        super.paint(graphics); 
       } 

      }; 
      gfm_transactioninfo.setMargin(10, 10, 0, 10);// set top and left margin 

lbl_CustEmail = new LabelField("Customer Email", LabelField.FOCUSABLE); 
       lbl_CustEmail.setFont(label_font); 

      value_CustEmail = new LabelField(proTransaction_details.getFromEmail()); 
      value_CustEmail.setFont(label_font); 

gfm_transactioninfo.add(lbl_CustEmail); 
         gfm_transactioninfo.add(new LabelField(" : ")); 
         gfm_transactioninfo.add(value_CustEmail); 

을 그리고 당신의 CustomGridFieldManager 클래스 완벽 ..

그냥 응원 .. :)

+1

고마워. 마침내 나를 위해 끝났어. 다시 한번 감사드립니다. –