1

私は、、を持ってHorizontalFieldManagerVerticalFieldManagerますLabelFieldLabelFieldに配置されHorizontalFieldManager、複数HorizontalFieldManagerがに配置されVerticalFieldManagerます。

labelfield.getHeight();を使用してLabelFieldの高さを取得しようとすると 0を返します。Labelfieldに複数の行がある場合は、高さも0を返します。同じ問題が直面していHorizontalFieldManagerます。

そこに到達した後、高さを計算VerticalFieldManagerし、画面の高さを動的に設定したいと思います。

LabelまたはHorizo​​ntalfieldmanagerの高さを計算するにはどうすればよいですか?

4

3 に答える 3

3

使用するlabelField.getPreferredHeight()_manager.getPreferredHeight()labelField.getHeight()

これはあなたのために働くはずです

于 2011-11-03T20:06:43.877 に答える
2

メソッド Farid は、labelWidth が必要になるため、使用が少し難しいことを示唆しています。複数行のラベルの場合、この labelWidth は、親マネージャーの使用可能な幅、または設定した正確な幅と同じではない場合があります。これは、単語が maxWidth に収まるか、収まらないかによって各行の幅が異なる可能性があるためです。

注: Nate がコメントで指摘したように、スペースの前払いも追加することをお勧めします。それを含むようにコードを修正しました。

これらの問題を克服するために私が使用する方法は次のとおりです。

public int getPreferredHeight() {
        String text = getText();

        int maxWidth = getManager().getPreferredWidth();
        int spaceAdvance = getFont().getAdvance(' ');
        String[] words = StringUtilities.stringToWords(text);
        int lastWordAdvance = 0;
        int lines = 1;
        for (int i = 0; i < words.length; i++) {
            int wordAdvance = getFont().getAdvance(words[i]) + spaceAdvance;
            if (lastWordAdvance + wordAdvance < maxWidth ) {
                lastWordAdvance += wordAdvance;
            } else {
                lines++;
                lastWordAdvance = wordAdvance;
            }
        }
        return (int)lines * getFont().getHeight(); 
    }
于 2013-08-08T08:44:47.793 に答える
1

LabelField のサイズに関する決定は、レイアウトが完了するまで残すことができれば、getHeight() から正確に取得できます。これは、LabelFieldのマージンやパディングを考慮して、実際に正しい結果を得ることができることを意味します。

int maxWidth = getManager().getPreferredWidth();

逃します。

フィールドを画面に追加するときに高さを知っておくとよいため、最初はこれが非常に難しいように思えます。しかし、一般的な原則は、マネージャーのサブレイアウトでこれを行う必要があるため、高さに依存するコードをプロセスの少し後で移動するだけです。これには、レイアウトが動的であるという利点があるため、LabelField のテキストが変更されると、レイアウトが呼び出され、高さに依存するコードも再度呼び出されます。

sublayout() で次のようなロジックを使用することもできます。

super.sublayout(...);

if (myField.getHeight() < 100 ) {

  myField.setMargin((100 - myField.getHeight())/2, 0, (100 - myField.getHeight())/2, 0);

  super.sublayout(...);

}

これはプロダクションに適した例ではありません。ピクセルの高さをハードコーディングすることはお勧めしません。分かりやすい例えですが……。

于 2013-08-09T09:25:32.470 に答える