2016-12-14 2 views
0

Т.Л., др Есть хороший способ, чтобы скрыть столбец в GridLayout, а также скрыть остальные интервалы между столбцами на материнской Composite?Скрыть столбец GridLayout и расстояние между ними остальными столбцами


У меня есть композит с несколькими колонками в GridLayout. Один столбец - это Composite с StackLayout, так что, если у вас есть какие-то действия, я могу скрыть/показать, что Composite.

Например: enter image description here

Чтобы сделать скрытие/показ я установка атрибута exclude на GridData и атрибут topControl на StackLayout:

// To hide 
stackLayout.topControl = null; 
stackComposite.setVisible(false); 
((GridData) stackComposite.getLayoutData()).exclude = true; 

Теперь, когда я скрываю в середине Composite, я вижу, что дополнительное пространство появляется в дальнем конце строки.

enter image description here

Это возможно потому, что GridLayout на базе Composite все еще имеет одинаковое число столбцов, так что мы видим столбец с толщиной 0, и указанный интервал колонке с обеих сторон.

Чтобы исправить это я придумал несколько (не идеальными) решений:

  1. Декремента/увеличивает количество столбцов скрытия/показ.

  2. Вместо того, чтобы использовать атрибут exclude, мы переопределить Composite с StackLayout и изменить computeSize(...) функции либо возвращать 0, или вычислить реальный размер в зависимости от того, хотим ли мы, чтобы появиться или нет. (Это, безусловно, мой нелюбимый вариант, и я чувствую себя плохо, даже писать это)

  3. Установите horizontalSpacing на базе Composite 0, а вместо этого используя интервал внутри каждого столбца Composite диктовать интервал. Это будет выглядеть так, когда скрытое:

enter image description here

Вариант 1 был наиболее заманчивыми до сих пор, однако есть более ясный недостаток здесь при попытке сохранить модульность кода. Например, если Composite для каждого столбца настроен каким-то многократно используемым компонентом, декремент/увеличение количества столбцов зависит от этого компонента, зная, что его родительский Composite имеет GridLayout - это не безопасное предположение!

Вариант 2 I flat-out не нравится.

Вариант 3 не является ужасным, однако он по-прежнему ощущается как неправильное использование интервалов и полей.Плюс к тому, чтобы вернуться к точке модульности, другие компоненты столбца будут отвечать за промежуток, который влияет на более крупный вид, вместо того, чтобы позволить большему виду диктовать интервал.

Так что мой вопрос сводится к: есть ли другой вариант, который лучше, чем эти три?


MCVE используется для получения изображения выше:

public class MCVE { 

    final Display display; 
    final Shell shell; 

    public MCVE() { 
     display = new Display(); 
     shell = new Shell(display); 
     shell.setLayout(new GridLayout()); 
     shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

     final Composite baseComposite = new Composite(shell, SWT.NONE); 
     baseComposite.setLayout(new GridLayout(3, false)); 
     baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
     baseComposite.setBackground(new Color(display, new RGB(125, 125, 255))); 

     final Composite contentComposite1 = new Composite(baseComposite, SWT.NONE); 
     contentComposite1.setLayout(new GridLayout()); 
     contentComposite1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
     final Label contentLabel1 = new Label(contentComposite1, SWT.NONE); 
     contentLabel1.setText("I stretch to fill available space!"); 

     final Composite stackComposite = new Composite(baseComposite, SWT.NONE); 
     final StackLayout stackLayout = new StackLayout(); 
     stackComposite.setLayout(stackLayout); 
     stackComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); 

     final Composite stackContentComposite = new Composite(stackComposite, SWT.NONE); 
     stackContentComposite.setLayout(new GridLayout()); 
     stackContentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
     final Label stackContentLabel = new Label(stackContentComposite, SWT.NONE); 
     stackContentLabel.setText("I can disappear and reappear!"); 

     stackLayout.topControl = stackContentComposite; 

     final Composite contentComposite3 = new Composite(baseComposite, SWT.NONE); 
     contentComposite3.setLayout(new GridLayout()); 
     contentComposite3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); 
     final Label contentLabel3 = new Label(contentComposite3, SWT.NONE); 
     contentLabel3.setText("I live on the end :("); 

     final Button flipButton = new Button(shell, SWT.PUSH); 
     flipButton.setText("Flip"); 
     flipButton.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(final SelectionEvent e) { 
       if (stackLayout.topControl == null) { 
        stackLayout.topControl = stackContentComposite; 
        ((GridData) stackComposite.getLayoutData()).exclude = false; 
        // ((GridLayout) baseComposite.getLayout()).numColumns++; 
        stackComposite.setVisible(true); 
        baseComposite.layout(true, true); 
       } else { 
        stackLayout.topControl = null; 
        ((GridData) stackComposite.getLayoutData()).exclude = true; 
        // ((GridLayout) baseComposite.getLayout()).numColumns--; 
        stackComposite.setVisible(false); 
        baseComposite.layout(true, true); 
       } 
      } 
     }); 
    } 

    public void run() { 
     shell.setSize(600, 115); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 

    public static void main(final String... args) { 
     new MCVE().run(); 
    } 

} 

ответ

1

Я не могу думать о каком-либо другом способе.

Вариант 1 определенно то, что я бы использовал и широко используется кодом Eclipse (например, кнопки на панели кнопок диалога).

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

+0

Хорошие баллы - я не думал явно проверять код Eclipse, как это обрабатывается (быстрый поиск показал это ['ViewSettingsDialog'] (http://www.javadocexamples.com/java_source/org/eclipse/ ui/preferences/ViewSettingsDialog.java.html), который делает что-то очень похожее). Спасибо за напоминание о взаимоотношениях с родителем там тоже, что смутило меня в течение самого долгого времени :) – avojak

Смежные вопросы