计算Composite的最小大小

时间:2013-01-17 14:48:40

标签: java swt

我需要计算Composite的最小或默认大小,它可以显示所有组件而不会剪裁。

我似乎只找到计算Composite首选尺寸的方法。这意味着Table或其他滚动复合将具有首选大小,该大小显示完整内容而不滚动。 ScrolledComposite将立即进入滚动模式,这不是我想要的。

GridLayout设法通过将GridData提示视为最小宽度/高度来实现此目的,允许抓取任何可用的额外空间。

问题与此问题有关:SWT - computingSize for Multi-line textfield inside ScrolledComposite

2 个答案:

答案 0 :(得分:2)

Control#computeSize(int, int)应该是您要搜索的内容:

Point size = comp.computeSize(SWT.DEFAULT, SWT.DEFAULT);
System.out.println(size.x + " " + size.y);

答案 1 :(得分:1)

我设法找到了解决方案。

关键是两件事:

  1. 确保在内容上设置调整大小侦听器(如果添加了CHILDREN并调用了layout())和ScrolledComposite(如果从子项外部调整大小)
  2. 确保同时设置GridData.grabGridData.hint。当你执行computeSize()时,提示将确保复合材料采用此尺寸,而抓取确保它将抓住任何可用的额外空间。
  3. 代码示例如下:

    public static void main (String [] args) {
      Display display = new Display ();
      Shell shell = new Shell(display);
      ScrolledComposite sc = new ScrolledComposite(shell, SWT.NONE);
      Composite foo = new Composite(sc, SWT.NONE);
      foo.setLayout(new GridLayout(1, false));
      StyledText text = new StyledText(foo, SWT.NONE);
      text.setText("Ipsum dolor etc... \n etc... \n etc....");
      GridDataFactory.fillDefaults().grab(true, true).hint(40, 40).applyTo(text);
    
      Listener l = new Listener() {
         public void handleEvent(Event e) {
             Point size = sc.getSize();
             Point cUnrestrainedSize = content.computeSize(SWT.DEFAULT, SWT.DEFAULT);
             if(size.y >= cUnrestrainedSize.y && size.x >= cUnrestrainedSize.x) {
               content.setSize(size);
               return;
             }
             // does not fit
             Rectangle hostRect = getBounds();
             int border = getBorderWidth();
             hostRect.width -= 2*border;
             hostRect.width -= getVerticalBar().getSize().x;
             hostRect.height -= 2*border;
             hostRect.height -= getHorizontalBar().getSize().y;
             c.setSize(
               Math.max(cUnrestrainedSize.x, hostRect.width),
               Math.max(cUnrestrainedSize.y, hostRect.height)
             );
         }
      }
      sc.addListener(SWT.Resize, l);
      foo.addListener(SWT.Resize, l);
    
      shell.open ();
      while (!shell.isDisposed ()) {
        if (!display.readAndDispatch ()) display.sleep ();
      }
      display.dispose ();
    }