Перерисовывание управления за композитом с помощью SWT.NO_BACKGROUND - PullRequest
2 голосов
/ 05 февраля 2010

Первоначальная цель:

У меня есть TreeMenu, который я использую для отображения моего меню. В этом дереве пользователь может выбирать различные элементы.

Я хотел бы отключить дерево, чтобы пользователь не мог выбрать новый элемент после выбора первого. Уловка в том, что мы не можем использовать setEnabled, потому что нам не разрешено использовать серый цвет. Внешний вид / цвета не могут измениться.

Предлагаемое нами решение

Нашей первой идеей было использование Composite с SWT.NO_BACKGROUND в верхней части меню, чтобы предотвратить любое взаимодействие пользователя с TreeMenu.

Код:

final Composite cover = new Composite(getPage().shell, SWT.NO_BACKGROUND);
cover.setLocation(getMenu().getLocation());
cover.setSize(getMenu().getSize());
cover.moveAbove(getMenu());

Это проблема с перерисовкой.

Если экран закрывается другим экраном, а затем возвращается на передний план, Композитное покрытие заполняется фрагментами предыдущего перекрывающегося окна.

Наша идея состояла в том, чтобы вручную перерисовать меню:

cover.moveBelow(getMenu());
getMenu().update();
cover.moveAbove(getMenu());

Мы поместили код внутри paintEventListener.

Но это вызвало бесконечный цикл и не решило проблему.

Вопросы

Кто-нибудь знает, как мы можем достичь нашей первоначальной цели?

Кто-нибудь знает, как мы можем заставить наше предлагаемое решение работать?

1 Ответ

3 голосов
/ 06 февраля 2010

Посмотрите на SWT-Snippet80 . Это показывает, как предотвратить выбор. Решением вашей проблемы будет добавление слушателя в дерево:

  tree.addListener(SWT.Selection, new Listener() {

     TreeItem[] oldSelection = null;


     public void handleEvent( Event e ) {
        Tree tree = (Tree)(e.widget);
        TreeItem[] selection = tree.getSelection();
        if ( oldSelection != null )
           tree.setSelection(oldSelection);
        else
           oldSelection = selection;
     }
  });

Я бы не рекомендовал пытаться реализовать ваш обходной путь. Я считаю, что размещение прозрачных элементов управления друг над другом не поддерживается в SWT - я думаю, что однажды прочитал комментарий от Стива Нортовера на эту тему. Даже если вы заставили это работать для одной ОС, она, вероятно, не будет работать в другой - это слишком много для взлома.

Решение, которое поддерживается SWT, имеет прозрачные окна друг над другом. Но это также очень сложно реализовать (изменение размера, перемещение, всегда сверху, перерисовывание артефактов) и, вероятно, такой же большой взлом, как и другие обходные пути. Иди за слушателем.

...