I have a class based on Composite
that embeds an SWT List
instance. Using the default settings, the list is five rows high on my WinXP system. Without relying on hard-coded pixel values or DPI settings and the like, how can I set the height of the list (and the surrounding composite) to a fixed number of rows, say 3, without any added inner margins?
我有一个基于Composite的类,它嵌入了一个SWT List实例。使用默认设置,我的WinXP系统上的列表高五行。如果不依赖于硬编码像素值或DPI设置等,如何将列表(以及周围复合体)的高度设置为固定行数(例如3),而不添加任何内边距?
public FileSetBox(Composite parent, int style)
{
super(parent, style);
setLayout(new FillLayout());
this.list = new List(this, SWT.V_SCROLL);
...
}
Update:
The following works, but it does not take into account the height added by the border, which results in parts of the last line being covered. Any ideas how to calculate this, too?
以下工作,但它没有考虑边框添加的高度,这导致最后一行的部分被覆盖。任何想法如何计算呢?
public FileSetBox(Composite parent, int style)
{
...
GC gc = new GC(this);
gc.setFont(this.list.getFont());
this.preferredHeight = gc.getFontMetrics().getHeight() * 3;
gc.dispose();
...
}
@Override
public Point computeSize(int arg0, int arg1)
{
Point size = super.computeSize(arg0, arg1);
return new Point(size.x, this.preferredHeight);
}
2 个解决方案
#1
Can't you use list.getBorderWidth() and list.getItemHeight() to get the height?
你不能使用list.getBorderWidth()和list.getItemHeight()来获取高度吗?
#2
public FileSetBox(Composite parent, int style) { super(parent, style); setLayout(new GridLayout(1, false)); this.list = new List(this, SWT.V_SCROLL); GridData data = new GridData(GridData.FILL_BOTH); data.heightHint = 10 * ((List)control).getItemHeight(); // height for 10 rows data.widthHint = getStringWidth(25, list); // width enough to display 25 chars list.setLayoutData(data); ... } public static int getStringWidth(int nChars, Control control){ GC gc = new GC(control); gc.setFont(control.getFont()); FontMetrics fontMetrics = gc.getFontMetrics(); gc.dispose(); return nChars * fontMetrics.getAverageCharWidth(); }
#1
Can't you use list.getBorderWidth() and list.getItemHeight() to get the height?
你不能使用list.getBorderWidth()和list.getItemHeight()来获取高度吗?
#2
public FileSetBox(Composite parent, int style) { super(parent, style); setLayout(new GridLayout(1, false)); this.list = new List(this, SWT.V_SCROLL); GridData data = new GridData(GridData.FILL_BOTH); data.heightHint = 10 * ((List)control).getItemHeight(); // height for 10 rows data.widthHint = getStringWidth(25, list); // width enough to display 25 chars list.setLayoutData(data); ... } public static int getStringWidth(int nChars, Control control){ GC gc = new GC(control); gc.setFont(control.getFont()); FontMetrics fontMetrics = gc.getFontMetrics(); gc.dispose(); return nChars * fontMetrics.getAverageCharWidth(); }