如何配置 ExpandBar 下的所有内容以在展开/折叠时跟随它?

How can I configure everything under an ExpandBar to follow it as it expands / collapses?

我有一个 ExpandBar,在它下面还有其他组件。下面是我正在使用的版本的简化示例:

有一个ExpandBar,我从一些示例中复制的,下面有一个Label。当我折叠 ExpandBar 时,我希望 Label 跟随。为此,我有以下内容:

bar.addExpandListener(new ExpandAdapter() {
    @Override
    public void itemCollapsed(ExpandEvent expandEvent) {
        item0.setHeight(0);
        shell.layout();
        super.itemCollapsed(expandEvent);
    }

    @Override
    public void itemExpanded(ExpandEvent expandEvent) {
        item0.setHeight(height);
        shell.layout();
        super.itemExpanded(expandEvent);
    }
});

当我崩溃时,我得到了预期的结果:

然而,当我再次尝试展开时,展开栏只有一个滚动条,并没有真正展开:

我试图就此事寻求帮助,但很难找到类似的东西。我研究了 pack()layout() 的机制,但无法通过打包 bar 对象来产生更好的结果。

怎样才能达到我想要的效果,就是折叠后展开时,GUI应该return到第一张图的状态?

似乎 expand/collapse 事件是在扩展栏的新状态完全实现之前触发的,并且重新布局父级使用了错误的小部件边界。

我之所以能够解决这个问题,是因为我使用 asyncExec() 推迟了布局代码。

这是我用来试验的片段:

public static void main( String[] args ) {
  Display display = new Display();
  Shell shell = new Shell( display );
  shell.setLayout( new RowLayout( SWT.VERTICAL ) );
  ExpandBar bar = new ExpandBar( shell, SWT.NONE );
  Composite composite = new Composite( bar, SWT.NONE );
  composite.setBackground( display.getSystemColor( SWT.COLOR_YELLOW ) );
  ExpandItem item = new ExpandItem( bar, SWT.NONE, 0 );
  item.setText( "First item" );
  item.setHeight( 200 );
  item.setControl( composite );
  Label label = new Label( shell, SWT.NONE );
  label.setText( "text" );

  bar.addExpandListener( new ExpandListener() {
    @Override
    public void itemExpanded( ExpandEvent event ) {
      relayout();
    }

    @Override
    public void itemCollapsed( ExpandEvent event ) {
      relayout();
    }

    private void relayout() {
      display.asyncExec( () -> {
        bar.pack();
        shell.layout();
      });
    }
  } );

  shell.setSize( 400, 350 );
  shell.open();
  while( !shell.isDisposed() ) {
    if( !display.readAndDispatch() ) {
      display.sleep();
    }
  }
  display.dispose();
}