Eclipse RCP: возможно ли сдвигать поля вверх без перерисовки? - PullRequest
0 голосов
/ 12 марта 2009

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

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

Есть ли способ достичь этого эффекта, не перерисовывая все элементы управления снова?

1 Ответ

0 голосов
/ 03 ноября 2009

Да, позвоните layout (true) на родителя.

Например, у меня есть представление, в верхней части которого находится панель поиска, видимость которой можно переключать. У меня есть метод для создания поискового композита и один для его удаления:

private void createNameSearchBar () {
    mySearchControl = new CardSearchControl (myViewComposite, SWT.NONE);
    mySearchControl.setSearchListener (this);
}


private void disposeNameSearchBar () {
    mySearchControl.dispose ();
    mySearchControl = null;
}

private CardSearchControl mySearchControl = null;
private Composite myViewComposite;
private boolean mySearchBarState;

Чтобы скрыть или показать элемент управления панели поиска, я вызываю этот метод (myViewComposite - элемент управления верхнего уровня, которому принадлежит панель поиска и все остальные элементы управления):

public void setSearchBarState (boolean show)  {
    mySearchBarState = show;

    if (myViewComposite == null  ||  myViewComposite.isDisposed ())
        return; // no work to do

    if (mySearchBarState  &&  mySearchControl == null)  {
        createNameSearchBar ();
        mySearchControl.moveAbove (null);
        myViewComposite.layout (true);
    }  else if (!mySearchBarState  &&  mySearchControl != null)  {
        disposeNameSearchBar ();
        myViewComposite.layout (true);
    }
}
...