WindowBuilder: переключение Composite в окне приложения

У меня есть окно приложения, в котором я хочу показать разные компоненты в зависимости от нескольких обстоятельств.

package graphicalInterface;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.RowLayout;

public class parentWindow {
    protected Shell shell;
    
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
    
    protected void createContents() 
    {
        shell = new Shell();
        shell.setSize(600, 400);
        shell.setText("Test");
        shell.setLayout(new RowLayout(SWT.HORIZONTAL));
        menu myMenu = new menu(shell, SWT.NONE);    
        menu myMenu2 = new menu(shell, SWT.NONE);   
        menu myMenu3 = new menu(shell, SWT.NONE);   
    }
}

Композит читает

package graphicalInterface;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.SWT;

public class menu extends Composite {
    public menu(Composite parent, int style) {
        super(parent, SWT.NONE);
        
        Button btnAzLicht = new Button(this, SWT.NONE);
        btnAzLicht.setBounds(10, 10, 150, 35);
        btnAzLicht.setText("AZ Licht");     
    }

    @Override
    protected void checkSubclass() {}
}

У меня также есть несколько других композитов, и я люблю загружать их по мере необходимости. Проблема в том, что я не знаю, как их разгрузить. Здесь я загрузил три меню, которые добавляются в верхнем левом углу окна. Если я просто перерисовываю окно (не загружая композиты во второй раз), они продолжают отображаться, удаление их не удалось. Я могу сделать их невидимыми, но если я загружу другую, то ее позиция не будет позицией невидимой, она будет добавлена ​​на следующем свободном месте. Установка границ также не помогла, и я не нашел способа установить их в указанные координаты окна, и всегда устанавливал только одну из них видимой.


person Inso    schedule 27.02.2021    source источник


Ответы (1)


Во-первых, не пытайтесь смешивать макеты с setBounds, это не сработает. Макеты переопределяют любые ограничения, которые вы используете.

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

В этом примере я использую эту версию вашего класса menu (переименованного в MyMenu — следуйте соглашениям о кодировании Java, имена классов начинаются с заглавной буквы):

public class MyMenu extends Composite
{
  public MyMenu(final Composite parent, final String text)
  {
    super(parent, SWT.NONE);

    setLayout(new FillLayout());

    Button btnAzLicht = new Button(this, SWT.NONE);
    btnAzLicht.setText(text);
  }

  @Override
  protected void checkSubclass()
  {
  }
}

Код для настройки оболочки с отображением только myMenu1:

shell.setLayout(new GridLayout());

MyMenu myMenu1 = new MyMenu(shell, "Text 1");
myMenu2.setVisible(true);

GridData data1 = new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
data1.exclude = false;
myMenu1.setLayoutData(data1);

MyMenu myMenu2 = new MyMenu(shell, "Text 2");
myMenu2.setVisible(false);

GridData data2 = new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
data2.exclude = true;
myMenu2.setLayoutData(data1);

MyMenu myMenu3 = new MyMenu(shell, "Text 3");
myMenu3.setVisible(false);

GridData data3 = new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
data3.exclude = true;
myMenu3.setLayoutData(data1);

Элементы управления myMenu2 и myMenu3 устанавливаются невидимыми и исключаются из макета.

Чтобы показать menu2, вы должны сделать:

myMenu1.setVisible(false);
data1.exclude = true;

myMenu2.setVisible(true);
data2.exclude = false;

shell.layout();

который изменяет параметры видимости и исключения, а затем вызывает layout для пересчета макета.

person greg-449    schedule 27.02.2021
comment
Пришлось изменить несколько имен, работает, как вы говорите. Проблема в том, что (мой вопрос был не очень хорошим :( ) Исходное меню имеет несколько кнопок, расположенных вертикально, при моей первоначальной настройке ширина была 170. При добавлении других композитов они располагались справа от него. Ширина меню плюс ширина другой композит был шириной окна, все в порядке. Теперь, после изменения макета, в окне все композиты имеют одинаковую ширину: меню слишком широкое, следующий композит помещается под ним. Теперь я мог просто добавить кнопки во все композиты ,удалить меню,сделать ширину окна.Или есть способ лучше? - person Inso; 28.02.2021
comment
Забудьте комментарий выше (просто сохранен на случай, если вы уже отвечаете). Я могу перемещать композиты и управлять ими в представлении дизайна. Работает как шарм, большое спасибо за вашу помощь! :) - person Inso; 28.02.2021