我第一次尝试使用SWT,我无法弄清楚如何使用菜单栏以及任何空间填充布局。在不考虑菜单的情况下计算Composite的布局,因此一旦添加了Menu,布局的底部就会被剪裁。
令人惊讶的是,当用户调整大小时,会考虑菜单并且布局正常。但我无法弄清楚如何以编程方式修复它; shell.layout(true,true)
,shell.setSize(250,250)
,shell.pack()
无法解决问题。
package com.appspot.htmldoodads.pdfstuffs;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
public class MenuLayout {
public static void main(String[] argv) {
final Display display = new Display();
final Shell shell = new Shell(display);
GridLayout shellLayout = new GridLayout();
shell.setLayout(shellLayout);
// Add a menu bar with File -> Open...
Menu bar = new Menu(shell, SWT.BAR);
shell.setMenuBar(bar);
MenuItem fileItem = new MenuItem(bar, SWT.CASCADE);
fileItem.setText("&File");
Menu subMenu = new Menu(shell, SWT.DROP_DOWN);
fileItem.setMenu(subMenu);
MenuItem openItem = new MenuItem(subMenu, SWT.CASCADE);
openItem.setText("&Open...");
// Add a button that fills the space.
Button big = new Button(shell, SWT.PUSH);
big.setText("Fill.");
GridData bigLayoutData = new GridData(GridData.FILL, GridData.FILL, true, true);
big.setLayoutData(bigLayoutData);
// Add a button that doesn't fill space.
new Button(shell, SWT.PUSH).setText("Regular");
shell.layout(true, true);
shell.setSize(250,250);
shell.open();
while ( ! shell.isDisposed ()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
答案 0 :(得分:3)
在我完成问题时,我想出了一个解决方案。我需要在 shell.layout()
之后调用shell.open()
,以便GTK可以在SWT计算可用的布局空间之前呈现菜单。
答案 1 :(得分:0)
添加到yonran的答案:
如果使用JFace和ApplicationWindow的子类作为主要入口点,则会为您执行shell.open()
。因此,不必使用JFace阻塞applicationWindow.open()
方法调用,而是必须使用典型的SWT循环。
JFace之前(没有工作,并且有问题描述的剪辑问题):
public static void main(String[] args) {
ApplicationWindow window = new MyApplicationWindow("My Window Title");
window.setBlockOnOpen(true);
window.open();
Display.getCurrent().dispose()
}
JFace After(正确显示没有任何剪辑):
public static void main(String[] args) {
ApplicationWindow window = new MyApplicationWindow("My Window Title");
window.open();
Shell shell = window.getShell();
shell.layout(true, true);
while (!shell.isDisposed())
if (!Display.getCurrent().readAndDispatch())
Display.getCurrent().sleep();
Display.getCurrent().dispose();
}