0

プロジェクトでは Vaadin 6.8.9 を使用しています。垂直レイアウトのポップアップ ウィンドウを作成し、いくつかのラベルとボタンを追加します。

奇妙なことに、ラベルの値に空白 (スペース、ハイフンなど) が含まれている場合、テキストの下に空のスペースを追加して高さを増やします。スペースごとに、最後に空の行が 1 行追加されているように見えます。ハイフンの場合は少なくなります - 行の半分かもしれません。つまり、a a a a a a a aメッセージは画面上で多くの空きスペースを必要とします (ラベルが多ければ多いほど、状況は悪化します)。

ウィンドウの作成に魔法はありません。新しいウィンドウを作成し、幅を 600 ピクセルに設定します。ウィンドウやラベルのその他の属性は設定しません。新しいテスト Vaadin プロジェクトでそれを再現できなかったので、問題はアプリにあるに違いないと思いますが、特定することはできません。

そのようなラベルの 1 つに対して生成されたサンプル コードを次に示します。

<div style="height: 180px; width: 54px; overflow: hidden;
    padding-left: 0px; padding-top: 0px;">
    <div style="float: left; margin-left: 0px;">
        <div class="v-label" style="width: 108px;">
            a a a a a a a a a a
        </div>
    </div>
</div>

ラベル値が 1 行しかない場合、最初の DIV の高さが 180px になるのはなぜですか? 高さ計算メカニズムはどこにありますか? Vaadin API で変更することは可能ですか?


編集: 要求されたポップアップ ウィンドウ コードを次に示しますが、このウィンドウに問題はないと確信しています。

public class InfoNotification extends Window {
    /* Few members and constructor. Members assignment and run init() only. */

    /** This method is run from constructor */
    private void init() {
        setModal(true);
        setResizable(false);
        setStyleName("info_notification");

        okButton = new Button();
        okButton.addListener(getCloseButtonListener(this));
        okButton.setClickShortcut(ShortcutAction.KeyCode.ENTER);
        okButton.setCaption(okLabel != null ? okLabel : SessionData
            .getMessage("infoNotification.okLabel"));

        initLayout();
    }

    private void initLayout() {
        VerticalLayout componentLayout = (VerticalLayout) getContent();
        componentLayout.setWidth(600, UNITS_PIXELS);
        if (messages != null) {
            for (String message : messages) {
                componentLayout.addComponent(new Label(message));
            }
        }
        componentLayout.addComponent(okButton);
        componentLayout.setComponentAlignment(okButton,
            Alignment.BOTTOM_CENTER);
        setReadOnly(false);
    }

    public Button.ClickListener getCloseButtonListener(final Window window) {
        return new Button.ClickListener() { /* listener code */ };
    }
}

今考えてみると、ウィンドウの幅は 600px のように見えますが、何らかの理由で Vaadin は非常に薄いと考えています (おそらく数ピクセル?)。その結果、多くの改行が検出されるため、より多くの高さが確保されます。実際、改行はまったくなく、空のスペースは使用されていません。しかし、それは私の推測にすぎません。


EDIT2: コンポーネントからすべてのサイズ設定を削除すると、ラベルの幅が 87px しかないことがわかりました。異なるラベル幅を設定しても何も変わりません。

private void initLayout() {
    VerticalLayout componentLayout = (VerticalLayout) getContent();
    componentLayout.setWidth(600, UNITS_PIXELS);
    componentLayout.setSizeUndefined(); // Removes all size settings.
    // Rest of method is the same.
}

Vaadin によってレンダリングされた HTML:

<div style="height: 36px; width: 87px; overflow: hidden; padding-left: 0px; padding-top: 0px;">
    <div style="float: left; margin-left: 0px;">
        <div class="v-label" style="width: 87px;">a a a a a a a a a a</div>
    </div>
</div>
4

1 に答える 1