我需要为表/树行设置自定义高度。当我在表中有项目时,听SWT.MeasureItem事件有效,但是当我有一个空表时,它不起作用。 有任何想法吗? 提前谢谢。
viewer.getTree().addListener(SWT.MeasureItem, new Listener() {
public void handleEvent(Event event) {
event.height = 30;
}
});
答案 0 :(得分:2)
您是否尝试在表格行或表格本身上设置高度?
如果您尝试设置表格行的高度,除非有一个要测量的项目,否则SWT.MeasureItem
事件不会被触发 - 因此不会为空表触发它们。见(有点可疑的似乎)Eclipse bug 134454。
在内部,Table
有setItemHeight(int)
,但您需要使用反射来访问它,因为它受到包保护。 Reflection是一种非常有用的高级语言功能 - 尤其是当您需要支持多个版本的Java运行时或多个版本的SWT时,其中添加了新方法或删除了旧方法。您可以动态查询类,方法,字段等的可用性,并仅在它们存在时调用它们。此外,您还可以访问通常受调用者保护的方法和字段。我不建议经常使用Reflection,但是当你没有其他选择时,可以依靠它。
This other stackoverflow question很好地解释了如何一般地调用私有方法,但这是获取setItemHeight
方法的方法签名并调用它的一个具体示例:
final Table table = new Table(parent, SWT.BORDER);
/* Set up table columns, etc. */
table.pack();
try
{
/*
* Locate the method setItemHeight(int). Note that if you do not
* have access to the method, you must use getDeclaredMethod(). If
* setItemHeight(int) were public, you could simply call
* getDeclaredMethod.
*/
Method setItemHeightMethod =
table.getClass().getDeclaredMethod("setItemHeight", int.class);
/*
* Set the method as accessible. Again, this would not be necessary
* if setItemHeight(int) were public.
*/
setItemHeightMethod.setAccessible(true);
/*
* Invoke the method. Equivalent to table.setItemHeight(50).
*/
setItemHeightMethod.invoke(table, 50);
}
catch (Exception e)
{
/*
* Reflection failed, it's probably best to swallow the exception and
* degrade gracefully, as if we never called setItemHeight. Maybe
* log the error or print the exception to stderr?
*/
e.printStackTrace();
}
但是,如果你真的只是想在表本身上设置高度,那么使用你的布局可能会更好。例如,为GridData.heightHint
设置GridLayout
。
答案 1 :(得分:0)
我的表格存在同样的问题,其中包含通过ColumnLabelProvider
方法getImage
提供的图片。我想要更高的行。
我注意到你使用的图像的最大高度设置了表格行的高度,所以一个非常愚蠢但有效的解决方法是使用更高的图像,为它们添加一些透明区域。