使用自动换行获取SWT标签的大小

时间:2015-11-14 01:51:01

标签: label swt size word-wrap

是否有办法在铺设之前获得标签计算的确切尺寸。

换句话说,让我们说有一个标签有一个很长的句子:

  

你好,你是怎么做的,我的名字是邦德,我没有名字,我住在伦敦,但世界是我的家。我在这里玩耍和享受。

这是一行。但是如果窗口不够大,那么标签会分成两行。

我想在布局之前找出它将占用的最终高度(这样我就可以相应地调整字体大小以便它显示在一行中)。

但是,如果我label.computeSize(SWT.DEFAULT, SWT.DEFAULT),它只返回它所需的大小而不包装。

如果有办法做到这一点会很棒。

2 个答案:

答案 0 :(得分:1)

必须使用Label样式创建所有SWT.WRAP的拳头。否则它永远不会包装它的文本。

然后你需要告诉computeSize标签应该有多宽。否则computeSize不知道在哪里换行并计算解包文本的大小。

如果指定所需的标签宽度,computeSize将返回必要的高度。

例如

Label label = new Label( shell, SWT.WRAP );
label.setText( "Snippets are minimal stand-alone programs that demonstrate specific techniques or functionality." );
Point size = label.computeSize( 200, SWT.DEFAULT );
System.out.println( size );  // Point {202, 47}

返回的sizePoint,其x字段(几乎)是所需的宽度,y字段表示显示包装文本所需的高度。< / p>

在我的系统上,大小为{202,47}(文本跨越两行),但这可能会因平台和字体大小而异。

答案 1 :(得分:1)

同意Rudiger Herrmann的answer。 我以前是为了我的目的而做的。但这取决于操作系统。我调整了字体大小,使标签在网格中排成一行。请在代码中查找评论。

parent.setLayout(new GridLayout(1, false));
label = new Label( parent, SWT.BORDER | SWT.WRAP );
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
label.setTouchEnabled(true);
label.setToolTipText("LABEL");
label.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_MAGENTA));
label.setBackground(SWTResourceManager.getColor(SWT.COLOR_GREEN));
label.setText( "Stack Overflow is a question and answer site for professional and enthusiast programmermers. It's built and run by you as part of the Stack Exchange network of Q&A sites." );
Point parentCompositeSize = parent.getShell().getSize();
System.out.println(parentCompositeSize);
// parentCompositeSize.x is width of parent window (Shell) width, if you have your desired width of (window / Composite) then you can give it direct in int
// Calculation of number of lines with default font ::
// Warning:: Calculations have some assumption as below.
//1. Spacing between two lines will be 1 unit.
//2. My Layout used is GRID Layout.
Point estimatedLabelSize = label.computeSize( parentCompositeSize.x, SWT.DEFAULT );
System.out.println( "Estimated Label Height " + estimatedLabelSize.y);  
FontData[] fD = label.getFont().getFontData();
int defaultFontSize = fD[0].getHeight(); //Font Height is 11 in my case.
defaultFontSize += 1; //1 is spacing between two lines, According to assumption
System.out.println(defaultFontSize + "default size");
int lines = estimatedLabelSize.y / defaultFontSize;
System.out.println("Default fonts will print " + lines + " lines" );
int suggestedFontSize = defaultFontSize / lines;
System.out.println(suggestedFontSize +" suggested size ");

fD[0].setHeight(suggestedFontSize);
final Font newFont = new Font(parent.getDisplay(), fD);
label.setFont(newFont);
label.addDisposeListener(new DisposeListener() {

    @Override
    public void widgetDisposed(DisposeEvent e) {
        newFont.dispose();
    }
});
相关问题