SWT在空表/树上自定义行高

时间:2012-02-27 13:22:50

标签: java swt

我需要为表/树行设置自定义高度。当我在表中有项目时,听SWT.MeasureItem事件有效,但是当我有一个空表时,它不起作用。 有任何想法吗? 提前谢谢。

viewer.getTree().addListener(SWT.MeasureItem, new Listener() {
     public void handleEvent(Event event) {
        event.height = 30;
     }
  });

2 个答案:

答案 0 :(得分:2)

您是否尝试在表格行表格本身上设置高度?

如果您尝试设置表格行的高度,除非有一个要测量的项目,否则SWT.MeasureItem事件不会被触发 - 因此不会为空表触发它们。见(有点可疑的似乎)Eclipse bug 134454

在内部,TablesetItemHeight(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提供的图片。我想要更高的行。 我注意到你使用的图像的最大高度设置了表格行的高度,所以一个非常愚蠢但有效的解决方法是使用更高的图像,为它们添加一些透明区域。