我有一个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应该返回第一张图片中的状态?
最佳答案
似乎在完全实现扩展栏的新状态并且重新布局父级时使用了错误的窗口小部件边界之前触发了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();
}