SWT Пользовательская высота строки на пустых таблицах / деревьях - PullRequest
2 голосов
/ 27 февраля 2012

Мне нужно установить собственную высоту для моих таблиц / строк дерева. Прослушивание событий SWT.MeasureItem работает, когда у меня есть элементы в моей таблице, но когда у меня пустая таблица, это не работает. Есть идеи? Заранее спасибо.

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

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Вы пытаетесь установить высоту строки таблицы или самой таблицы ?

Если вы пытаетесь установить высоту строк таблицы, SWT.MeasureItem события не запускаются, если нет элемента для измерения - поэтому они не будут запущены для пустой таблицы. См. (Несколько сомнительный вид) Ошибка Eclipse 134454 .

Внутренне, Table имеет setItemHeight(int), но вам нужно использовать отражение для доступа к нему, поскольку он защищен пакетом. Отражение - это расширенная языковая функция, которая может быть исключительно полезна, особенно если вам необходимо поддерживать несколько версий среды выполнения Java или несколько версий SWT, где добавляются новые методы или удаляются старые методы. Вы можете динамически запрашивать доступность классов, методов, полей и т. Д. И вызывать их, только если они существуют. Кроме того, вы можете получить доступ к методам и полям, которые обычно защищены для вызывающей стороны. Я бы не рекомендовал часто использовать Reflection, но приятно отступать, когда у вас нет других вариантов.

Этот другой вопрос о стековом потоке хорошо объясняет, как обычно вызывать закрытый метод, но вот конкретный пример получения сигнатуры метода для 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.

0 голосов
/ 20 ноября 2012

У меня была такая же проблема с таблицей, которая содержала изображения, предоставленные с помощью ColumnLabelProvider метода getImage.Я хотел более высокие ряды.Я заметил, что максимальная высота изображений, которые вы используете, устанавливает высоту строк таблицы, поэтому довольно тупой, но эффективный обходной путь - использовать более высокие изображения, добавляя к ним несколько прозрачных областей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...