SWT Composite在窗口最大化时不可见

时间:2016-10-06 13:30:31

标签: java eclipse swt windowbuilder

在Neon Eclipse的windowbuilder中使用SWT Jface Java项目。 在shell上有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不再可见。

如何在窗口最大化时显示复合材料?

1 个答案:

答案 0 :(得分:1)

您已指定StackLayout作为shell的布局。这期望一次只显示一个子控件,并且必须将topControl字段设置为要显示的控件。

所以你需要做一些事情:

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

...

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

请勿在任何合成中调用setVisible,因为这会使StackLayout混淆。