SWT Composite не отображается при максимизации окна

Работа над Java-проектом SWT Jface в конструкторе окон в Neon Eclipse. Имейте 2 композита в оболочке, которые отображаются для обработчика событий.

package br.engenharia.investimentos;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Group;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.GridData;

public class Investimentos {

    protected Shell shellSistemaInvestimentos;
    private Text txtCompra;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            Investimentos window = new Investimentos();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shellSistemaInvestimentos.open();
        shellSistemaInvestimentos.layout();
        while (!shellSistemaInvestimentos.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * Create contents of the window.
     */
    protected void createContents() {
        shellSistemaInvestimentos = new Shell();
        shellSistemaInvestimentos.setSize(450, 300);
        shellSistemaInvestimentos.setText("Sistema Investimentos");
        shellSistemaInvestimentos.setLayout(new StackLayout());

        Composite compositeAcoesCompra = new Composite(shellSistemaInvestimentos, SWT.NONE);
        compositeAcoesCompra.setFont(SWTResourceManager.getFont("Segoe UI", 16, SWT.BOLD));
        compositeAcoesCompra.setLayout(new FormLayout());

        txtCompra = new Text(compositeAcoesCompra, SWT.BORDER | SWT.WRAP | SWT.CENTER);
        FormData fd_txtCompra = new FormData();
        fd_txtCompra.top = new FormAttachment(0, 5);
        fd_txtCompra.left = new FormAttachment(0);
        fd_txtCompra.right = new FormAttachment(100);
        txtCompra.setLayoutData(fd_txtCompra);
        txtCompra.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND));
        txtCompra.setFont(SWTResourceManager.getFont("Segoe UI", 16, SWT.BOLD));
        txtCompra.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_RED));
        txtCompra.setText("A\u00E7\u00F5es - Compra");

        Composite compositeAcoesOperacao = new Composite(shellSistemaInvestimentos, SWT.NONE);

        Composite compositeAcoesResultado = new Composite(shellSistemaInvestimentos, SWT.NONE);

        Composite compositeAcoesEvento = new Composite(shellSistemaInvestimentos, SWT.NONE);

        Menu menuPrincipalBar = new Menu(shellSistemaInvestimentos, SWT.BAR);
        shellSistemaInvestimentos.setMenuBar(menuPrincipalBar);

        MenuItem mntmAcoesSubmenu = new MenuItem(menuPrincipalBar, SWT.CASCADE);
        mntmAcoesSubmenu.setText("A\u00E7\u00F5es");

        Menu menuAcoesCascade = new Menu(mntmAcoesSubmenu);
        mntmAcoesSubmenu.setMenu(menuAcoesCascade);

        //Set compositeAcoesCompra visible. After I'll make the same for others.
        MenuItem mntmCompraItem = new MenuItem(menuAcoesCascade, SWT.NONE);
        mntmCompraItem.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                compositeAcoesCompra.setVisible(true);
                compositeAcoesOperacao.setVisible(false);
                compositeAcoesResultado.setVisible(false);
                compositeAcoesEvento.setVisible(false);
            }
        });
        mntmCompraItem.setText("Compra");

        MenuItem mntmOperacaoItem = new MenuItem(menuAcoesCascade, SWT.NONE);
        mntmOperacaoItem.setText("Opera\u00E7\u00E3o");

        MenuItem mntmResultadoItem = new MenuItem(menuAcoesCascade, SWT.NONE);
        mntmResultadoItem.setText("Resultado");

        MenuItem mntmEventoItem = new MenuItem(menuAcoesCascade, SWT.NONE);
        mntmEventoItem.setText("Evento");

    }
}

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

Что сделать, чтобы Composite был виден при разворачивании окна?


person muhaass    schedule 06.10.2016    source источник
comment
Вам нужно показать нам минимальный воспроизводимый пример   -  person greg-449    schedule 06.10.2016
comment
Выложил полный код. Спасибо.   -  person muhaass    schedule 06.10.2016


Ответы (1)


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

Итак, вам нужно сделать что-то вроде:

StackLayout layout = new StackLayout();
shellSistemaInvestimentos.setLayout(layout);

...

layout.topControl = compositeAcoesCompra; // whichever control you want to show

Не вызывайте setVisible ни для одного из композитов, так как это запутает StackLayout.

person greg-449    schedule 06.10.2016
comment
Решено с помощью layout.topControl. - person muhaass; 07.10.2016