如何在 SWT 中设置 ScrolledComposite 的最大高度
How to set the max height of ScrolledComposite in SWT
我有一个带有按钮的 ScrolledComposite
,它在下面创建了一个新按钮,"on the next row"。每次我用 pack()
.
调整我的复合材料的高度
但现在我想设置最大高度,这样 window 的高度从某个尺寸开始保持不变,我得到一个垂直滚动条。
调用 pack()
将始终调整控件的大小,以便它可以显示其全部内容。相反,滚动复合的大小应该由其父级的布局管理。这就是滚动组合的全部目的:显示包含的控件并在需要时提供滚动条。
使用setMinSize()
控制何时显示滚动条。下面的示例以带有单个按钮的滚动组合为特色。按下按钮将添加另一个按钮。请注意,在添加按钮后,最小尺寸会在 updateMinSize()
.
中重新计算
public class DynamicScrolledComposite {
public static void main( String[] args ) {
Display display = new Display();
Shell shell = new Shell( display );
shell.setLayout( new FillLayout() );
ScrolledComposite scrolledComposite = new ScrolledComposite( shell, SWT.H_SCROLL | SWT.V_SCROLL );
scrolledComposite.setExpandVertical( true );
scrolledComposite.setExpandHorizontal( true );
scrolledComposite.addListener( SWT.Resize, event -> updateMinSize( scrolledComposite ) );
Composite composite = new Composite( scrolledComposite, SWT.NONE );
composite.setLayout( new GridLayout( 1, false ) );
createButton( composite );
scrolledComposite.setContent( composite );
shell.setSize( 600, 300 );
shell.open();
while( !shell.isDisposed() ) {
if( !display.readAndDispatch() )
display.sleep();
}
display.dispose();
}
private static void updateMinSize( ScrolledComposite scrolledComposite ) {
Rectangle clientArea = scrolledComposite.getClientArea();
clientArea.width -= scrolledComposite.getVerticalBar().getSize().x;
Point minSize = scrolledComposite.getContent().computeSize( clientArea.width, SWT.DEFAULT );
scrolledComposite.setMinSize( minSize );
}
private static void createButton( Composite parent ) {
Button button = new Button( parent, SWT.PUSH );
button.setText( "Add another button" );
button.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event event ) {
createButton( parent );
ScrolledComposite scrolledComposite = ( ScrolledComposite )button.getParent().getParent();
button.getParent().requestLayout();
updateMinSize( scrolledComposite );
}
} );
}
}
要详细了解 ScrolledComposite
的不同内容管理策略,请参阅此处:http://www.codeaffine.com/2016/03/01/swt-scrolledcomposite/
我有一个带有按钮的 ScrolledComposite
,它在下面创建了一个新按钮,"on the next row"。每次我用 pack()
.
但现在我想设置最大高度,这样 window 的高度从某个尺寸开始保持不变,我得到一个垂直滚动条。
调用 pack()
将始终调整控件的大小,以便它可以显示其全部内容。相反,滚动复合的大小应该由其父级的布局管理。这就是滚动组合的全部目的:显示包含的控件并在需要时提供滚动条。
使用setMinSize()
控制何时显示滚动条。下面的示例以带有单个按钮的滚动组合为特色。按下按钮将添加另一个按钮。请注意,在添加按钮后,最小尺寸会在 updateMinSize()
.
public class DynamicScrolledComposite {
public static void main( String[] args ) {
Display display = new Display();
Shell shell = new Shell( display );
shell.setLayout( new FillLayout() );
ScrolledComposite scrolledComposite = new ScrolledComposite( shell, SWT.H_SCROLL | SWT.V_SCROLL );
scrolledComposite.setExpandVertical( true );
scrolledComposite.setExpandHorizontal( true );
scrolledComposite.addListener( SWT.Resize, event -> updateMinSize( scrolledComposite ) );
Composite composite = new Composite( scrolledComposite, SWT.NONE );
composite.setLayout( new GridLayout( 1, false ) );
createButton( composite );
scrolledComposite.setContent( composite );
shell.setSize( 600, 300 );
shell.open();
while( !shell.isDisposed() ) {
if( !display.readAndDispatch() )
display.sleep();
}
display.dispose();
}
private static void updateMinSize( ScrolledComposite scrolledComposite ) {
Rectangle clientArea = scrolledComposite.getClientArea();
clientArea.width -= scrolledComposite.getVerticalBar().getSize().x;
Point minSize = scrolledComposite.getContent().computeSize( clientArea.width, SWT.DEFAULT );
scrolledComposite.setMinSize( minSize );
}
private static void createButton( Composite parent ) {
Button button = new Button( parent, SWT.PUSH );
button.setText( "Add another button" );
button.addListener( SWT.Selection, new Listener() {
@Override
public void handleEvent( Event event ) {
createButton( parent );
ScrolledComposite scrolledComposite = ( ScrolledComposite )button.getParent().getParent();
button.getParent().requestLayout();
updateMinSize( scrolledComposite );
}
} );
}
}
要详细了解 ScrolledComposite
的不同内容管理策略,请参阅此处:http://www.codeaffine.com/2016/03/01/swt-scrolledcomposite/