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

标签 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");

    }
}

事件处理程序使复合 Material 可见,但当窗口最大化时,复合 Material 不再可见,除非再次设置事件处理程序。

如何才能使 Composite 在窗口最大化时可见?

最佳答案

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

所以你需要做类似的事情:

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

...

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

请勿在任何组合上调用 setVisible,因为这会混淆 StackLayout

关于java - SWT Composite 在窗口最大化时不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39897418/

相关文章:

java - 尝试 FilteredTree 时出现 AssertionFailedException

java - 如何从命令行运行 Intellij 项目

java - ChronicleMap 条目的最大数量

java - 自动展开 Eclipse 插件 jar

Windows 7 和 gnuplot 4.6 下的 Javaplot - 消失的结果

java - 如何配置 ExpandBar 下的所有内容以使其在展开/折叠时跟随它?

将文本文件的内容放入数组然后显示和操作数组内容的 Java 问题

java - Apache httpclient 建立大量连接

eclipse - Gradle boot创建的可执行jar重新打包缺少的jar

java - 使用 swt 处理按键