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

时间:2016-04-11 18:46:12

标签: java swt

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

Initial state.

我从一些示例中复制了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);
    }
});

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

Shell after collapse.

但是,当我再次尝试展开时,展开栏仅包含一个滚动条,并且实际上并未展开:

Expand Bar does not properly expand.

我试图找到有关此事的帮助,但我很难找到类似的东西。我查看了pack()layout()的机制,并且无法通过打包bar对象来生成更好的结果。

如何实现我追求的结果,也就是说,在折叠之后,当我展开时,GUI应该返回到第一张图片中的状态?

1 个答案:

答案 0 :(得分:1)

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

我能够解决这个问题,因为我使用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();
}