如何在SWT中设置ScrolledComposite的最大高度

时间:2017-07-04 10:57:10

标签: java swt scrolledcomposite

我有一个ScrolledComposite,其中有一个按钮可以在下面创建一个新按钮"在下一行"。每次我使用pack()调整复合材料的高度。

但是现在我想设置最大高度,从一定大小开始,窗口的高度保持不变,我得到一个垂直滚动条。

1 个答案:

答案 0 :(得分:1)

调用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/