如何配置 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();
}
我有一个 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();
}