在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不再可见。
如何在窗口最大化时显示复合材料?
答案 0 :(得分:1)
您已指定StackLayout
作为shell的布局。这期望一次只显示一个子控件,并且必须将topControl
字段设置为要显示的控件。
所以你需要做一些事情:
StackLayout layout = new StackLayout();
shellSistemaInvestimentos.setLayout(layout);
...
layout.topControl = compositeAcoesCompra; // whichever control you want to show
请勿在任何合成中调用setVisible
,因为这会使StackLayout
混淆。