如何使滚动窗格适应其内容?

How to make a scrollpane adjust to its content?

我正在尝试显示一个 Morph,它可以在显示时扩大和缩小。为了不冒 Morph 超出 window 的风险,我想将它放在 ScrollPane 中,这样如果它对于 window。例如:

rows := Morph new


layoutPolicy: TableLayout new;
    listDirection: #topToBottom;
    color: Color white.
sp := ScrollPane new
    extent: 100@100.
sp scroller addMorph: rows.

rows addMorphBack: (RectangleMorph new color: Color red).
rows addMorphBack: (RectangleMorph new color: Color blue).
sp openInWindow.
rows addMorphBack: (RectangleMorph new color: Color green).

我的问题是,在此示例中,绿色矩形不再适合 window,但没有显示滚动条。如果切换最后两行代码,我会得到一个滚动条。

因此我的问题是:有没有办法让 ScrollPane 知道它的滚动条中的 Morph 增加了?

似乎只要向 ScrollPane 发送一条消息就可以解决问题:

sp hideOrShowScrollBars.

我第一次尝试通知 morph 有关布局更改的信息 rows layoutChanged. 但没有成功。

然后,为了发现这个技巧,我浏览了 scroller 消息的所有发件人(select 文本窗格中的滚动条,然后按 alt+n ctrl+n 或 cmd+n,具体取决于平台),以及对 ScrollPanescroller 实例变量的所有访问(使用 alt+m 浏览滚动条的实现,然后 select ScrollPane>>scroller 方法中的 inst var 并按 alt/ctrl/cmd+shift+n,或从浏览器中执行相同的操作 ScrollPane browse),直到我找到合理的消息发送。

我正要回答和aka.nice一样的问题 但它并不总是显示正确的滚动条。 好像

sp setScrollDeltas.

hideOrShowScrollBars 相同,并且多一点。