2012-09-17 30 views
1

我需要使用垂直字段管理器水平居中LabelField。我還需要增加此LabelField的字體大小。我發現,一旦我使用FIELD_HCENTER居中,如果我改變字體的大小,它會改變字段的位置。如何以大字體居中LabelField

這是代碼

VerticalFieldManager vfm = new VerticalFieldManager(Field.FIELD_VCENTER | Manager.USE_ALL_WIDTH); 
LabelField title = new LabelField("My Title",Field.FIELD_HCENTER) ; 
title.setFont(Font.getDefault().derive(Font.BOLD, 18, Ui.UNITS_pt); 
vfm.add(title); 

(如果刪除第三行,title.setFont,那麼標題爲中心,否則,它不是)。我需要一些幫助來獲得解決方案。 任何幫助表示讚賞? 謝謝

+1

你只需要一個'LabelField'在水平方向上'VerticalFieldManager'爲中心,否則你會添加更多的字段到'VerticalFieldManager'? – Rupak

+0

我需要在'VerticalFieldManager'中添加三個'LabelField's。謝謝。所有這些都需要以中心爲中心。 –

回答

1

您可以通過重寫sublayout方法VerticalFieldManager來創建一個自定義FieldManger,該方法將其放置在中心位置。其次是這樣一個實施。

class CustomVerticalFieldManger extends VerticalFieldManager { 
     private final int VERTICAL_GAP = 30; 

     protected void sublayout(int maxWidth, int maxHeight) { 
      int nFields = getFieldCount(), height = 0, xPosition, yPosition = 0; 
      Field f; 
      for (int i = 0; i < nFields; i++) { 
       f = getField(i); 
       layoutChild(f, maxWidth, maxHeight); 
       height += f.getHeight(); 
       if (i != 0) { 
        height += VERTICAL_GAP; 
       } 
      } 
      for (int i = 0; i < nFields; i++) { 
       f = getField(i); 
       xPosition = (maxWidth - f.getWidth())/2; 
       setPositionChild(f, xPosition, yPosition); 
       yPosition += f.getHeight(); 
       if (i != nFields - 1) { 
        yPosition += VERTICAL_GAP; 
       } 
      } 
      setExtent(maxWidth, height); 
     } 
    } 

使用

class MyScreen extends MainScreen { 
    private LabelField lblOne, lblTwo, lblThree; 

    public MyScreen() { 
     CustomVerticalFieldManger cvfm = new CustomVerticalFieldManger(); 
     cvfm.setBackground(BackgroundFactory.createSolidBackground(Color.AQUA)); 

     lblOne = new LabelField("The quick brown fox jumps over the lazy dog"); 
     lblTwo = new LabelField("The quick brown fox jumps over the lazy dog"); 
     lblThree = new LabelField("The quick brown fox jumps over the lazy dog"); 

     cvfm.add(lblOne); 
     cvfm.add(lblTwo); 
     cvfm.add(lblThree); 

     add(cvfm); 

     changeFont(); 
    } 

    private int fontSize = 5; 

    private void changeFont() { 
     Timer timer = new Timer(); 
     TimerTask task = new TimerTask() { 
      public void run() { 
       UiApplication.getUiApplication().invokeLater(new Runnable() { 
        public void run() { 
         if (fontSize == 50) { 
          fontSize = 5; 
         } 
         lblOne.setFont(Font.getDefault().derive(Font.PLAIN, 
           fontSize)); 
         lblTwo.setFont(Font.getDefault().derive(Font.PLAIN, 
           fontSize + 2)); 
         lblThree.setFont(Font.getDefault().derive(Font.PLAIN, 
           fontSize + 4)); 
         fontSize += 6; 
         updateLayout(); 
         invalidate(); 
        } 
       }); 
      } 
     }; 

     timer.schedule(task, 500, 1000); 
    } 
} 
+0

工作正常。 「高度」似乎是一個未使用的變量。你打算用它來做什麼? –

+0

是的,「高度」是一個重要的變量,它是經理的最終高度。它應該是'setExtent()'的第二個參數,但是在這種情況下'yPosition'和'height'的值是相同的,並且使用'yPosition'而不是'height'不會產生任何問題。你可以編輯這個答案,並用'setExtent(maxWidth,height)'替換'setExtent(maxWidth,yPosition);''' – Rupak