我有一个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应该返回到第一张图片中的状态?
答案 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();
}