是否有办法在铺设之前获得标签计算的确切尺寸。
换句话说,让我们说有一个标签有一个很长的句子:
你好,你是怎么做的,我的名字是邦德,我没有名字,我住在伦敦,但世界是我的家。我在这里玩耍和享受。
这是一行。但是如果窗口不够大,那么标签会分成两行。
我想在布局之前找出它将占用的最终高度(这样我就可以相应地调整字体大小以便它显示在一行中)。
但是,如果我label.computeSize(SWT.DEFAULT, SWT.DEFAULT)
,它只返回它所需的大小而不包装。
如果有办法做到这一点会很棒。
答案 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}
返回的size
是Point
,其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();
}
});