實際炸出這個問題的場景是「用 LayerSprite 作 CSS Flexbox 的基本效果」,程式碼大致如下:
VerticalLayoutContainer scroll = new VerticalLayoutContainer();
scroll.setScrollMode(ScrollMode.AUTOY);
scroll.add(new FlexboxLayerSprite(), new VerticalLayoutData(1, -1));
VerticalLayoutContainer base = new VerticalLayoutContainer();
//base 要改成 SimpleLayoutContainer 之類的都行,這裡這樣寫只是較貼近大多數的實作需求
base.add(foo, new VerticalLayoutData(1, 60));
base.add(scroll, new VerticalLayoutData(1, 1));
FlexboxLayerSprite.adjustMember() 必須依照 base 給予的 width,才能計算出所需要的 height。
在 base 改變 width 時,FlexboxLayerSprite 的 width 跟著改變,所以必須作兩個回合的 adjustMember():
@Override
protected void adjustMember() {
double needHeight = computeHeight();
//第一回合
if (getHeight() != needHeight ) {
resize(getWidth(), needHeight);
//resize() 會再度觸發 adjustMember() 所以後面不繼續作
return;
}
//實際調整 member 的邏輯
}
看起來邏輯好像正確,但實際結果 scroll 的大小是正確的(廢話),可是 FlexboxLayerSprite.asWidget() 的大小卻是有問題的,目前原因不明.......
即使沒有出問題,可能也要提供一個機制來避免這繞來繞去的邏輯(謎之聲:designer 都搞不清楚了,誰會相信一般 caller 可以正確而快樂的寫出來...... 😱 )。至於這應該作在 LayerSprite.resize()?還是讓 LayerSprite.asWidget() 可以有不同的 return class?還是有其他種可能?就....... 還沒有一個定論(謎之聲:先生出 SSCCE 吧你 [指])
當然,最簡單的解法是 LayerSprite 直接提供 scroll 的功能,但是... 實作太硬,不考慮...... 🙈
實際炸出這個問題的場景是「用
LayerSprite作 CSS Flexbox 的基本效果」,程式碼大致如下:FlexboxLayerSprite.adjustMember()必須依照 base 給予的 width,才能計算出所需要的 height。在
base改變 width 時,FlexboxLayerSprite的 width 跟著改變,所以必須作兩個回合的adjustMember():看起來邏輯好像正確,但實際結果
scroll的大小是正確的(廢話),可是FlexboxLayerSprite.asWidget()的大小卻是有問題的,目前原因不明.......即使沒有出問題,可能也要提供一個機制來避免這繞來繞去的邏輯(謎之聲:designer 都搞不清楚了,誰會相信一般 caller 可以正確而快樂的寫出來...... 😱 )。至於這應該作在
LayerSprite.resize()?還是讓LayerSprite.asWidget()可以有不同的 return class?還是有其他種可能?就....... 還沒有一個定論(謎之聲:先生出 SSCCE 吧你 [指])當然,最簡單的解法是
LayerSprite直接提供 scroll 的功能,但是... 實作太硬,不考慮...... 🙈